2015-01-09 2 views
-2

Я новичок на ассемблере и изучаю его для экзаменов. Я программист и работал в C, C++, java, asp.net.Как данные хранятся в памяти или регистре

У меня есть tasm с победой xp.

Я хочу знать, как данные хранятся в памяти или регистрируются. Я хочу знать этот процесс. Я считаю, что это примерно так:

Во время ввода данных, например. номер:

Ввод десятичного числа -> Преобразован в шестнадцатеричный -> Сохранение ASCII шестнадцатеричного кода в регистры или память.

При получении данных:

ASCII в шестнадцатеричной в регистрах или памяти -> переустроенные в Hex -> Show Decimal номер на мониторе.

Правильно. ? Если нет, то может кто-нибудь сказать мне, с простым, например,

Хорошо, Майкл: Смотри ниже код, где я пытаюсь добавить две 1-значные номера, чтобы отобразить 2 цифры результата, как 6 + 5 = 11

Sseg segment stack 

ends 

code segment 
;30h to 39h represent numbers 0-9 

MOV  BX, '6' ; ASCII CODE OF 6 IS STORED IN BX, equal to 36h 
ADD  BX, '5' ; ASCII CODE OF 5 (equal to 35h) IS ADDED IN BX, i.e total is 71h 

Спасибо, Майкл ... Я принимаю свою ошибку ....

Хорошо, так вот, BX = 0071h, справа? Означает ли это, что BL = 00 и BH = 71?

Однако, если я это сделаю, я не могу узнать, как показать результат 11?

Эй Blechdose,

Можете ли вы помочь мне в еще одной проблемы. Я пытаюсь сравнить 2 значения. Если оба они одинаковы, то dl = 1 в противном случае dl = 0. Но в следующем коде он отображает 0 для тех же значений, он показывает мне 0. Почему это не прыгает?

sseg segment stack 
ends 

code segment 
    assume cs:code 
    mov dl,0 

    mov ax,5 
    mov bx,5 
    cmp ax,bx 
    jne NotEqual 
    je equal 

NotEqual: 
    mov dl,0 
    add dl,30h 
    mov ah,02h 
    int 21h 

    mov ax,4c00h 
    int 21h 

equal: mov dl,1 
    add dl,30h 
    mov ah,02h 
    int 21h 

    mov ax,4c00h 
    int 21h 

code ends 
end NotEqual 
end equal 
+1

У этого действительно нет ответа, потому что вы можете его сохранить, как хотите. Обычно он будет храниться как int, конечно, поэтому никаких ascii не учитываются, кроме ввода и вывода. – harold

+1

Что означает _ «ввод данных» _ и _ «выборка данных» _ означает здесь точно? Пожалуйста, проиллюстрируйте некоторым фактическим (прокомментированным) кодом. Я не уверен, почему вам кажется, что преобразование «строка-в-int» и «int-to-string» каким-то образом напрямую связано с регистрами CPU (?). Регистр просто содержит фиксированное количество бит, вот и все. – Michael

+0

Ввод означает, что I m вводит данные в регистры 6 и 5, делая операцию (например, добавление), 6 + 5 и получая результат 11 из регистра для мониторинга. – Piyush

ответ

1

Регистры состоят из бит. Бит может иметь логическое значение 0 или 1. Это «логическое значение» для нас, но на самом деле оно представлено каким-то напряжением внутри аппаратного обеспечения. Например, 4-5 вольт интерпретируется как «логика 1» и 0-1 вольт как «логика 0». Регистр BX имеет 16 таких бит.

Допустим, что текущее содержимое BX: 0000000000110110. Поскольку очень трудно читать эти длинные строки 0 и 1 для людей, мы объединяем каждые 4 бита в 1 шестнадцатеричный, чтобы получить более читаемый формат для работы с , ЦП не знает, что такое шестнадцатеричное или десятичное число. Он может работать только с двоичным кодом. Хорошо, давайте использовать более читаемый формат для нашего BX регистра:

0000 0000 0011 0110 (actual BX content) 
0 0 3 6  (HEX format for us) 
       54 (or corresponding decimal value) 

При отправке этого значения (36ч), в выходном терминал, он будет интерпретировать это значение как ASCII-Charakter. Таким образом, он отобразит «6» для 36-го значения.

Если вы хотите добавить 6 + 2 с монтажом, вы помещаете в регистры 0110 (6) и 0010 (2). Ваш ассемблер TASM делает работу за вас. Это позволяет вам писать «6» (ASCII) или 0x6 (шестнадцатеричный) или даже 6 (десятичный) в коде asm-source и преобразовать это для вас в двоичный номер, который принимает регистр. ПРЕДУПРЕЖДЕНИЕ: «6» не помещает значение 6 в регистр, а ASCII-код для 6. Вы не можете напрямую рассчитать это.

Пример: 6 + 2 = 8

mov BX, 6h ; We put 0110 (6) into BX. (actually 0000 0000 0000 0110, 
       ; because BX is 16 Bit, but I will drop those leading 0s) 
add BX, 2h ; we add 0010 (2) to 0110 (6). The result 1000 (8) is stored in BX. 
add BX, 30h ; we add 00110000 (30h). The result 00111000 (38h) is stored in BX. 
       ; 38h is the ASCII-code, which your terminal output will interpret as '8' 

Когда вы делаете расчет, как 6 + 5 = 11, то это будет еще более сложной, потому что нужно преобразовать результат 1011 (11) в 2 ASCII,-цифры '1' и '1' (3131h = 00110001 00110001)

После добавления 6 (0110) + 5 (0101) = 11 (1011), BX будет содержать это (без пробелов):

0000 0000 0000 1011 (binary) 
    0 0 0 B (Hex) 
       11 (decimal) 
|__________________| 
     BX 
|________||________| 
    BH  BL 

BH - старший байт BX, а BL - младший байт BX. В нашем примере BH равно 00h, тогда как BL содержит 0bh.

Чтобы отобразить результат суммирования на выходе терминала, вам необходимо преобразовать его в ASCII-код. В этом случае вы хотите отобразить «11». Таким образом, вам нужно два раза «1-ASCII-персонаж». Просмотрев одну из таблиц ASCII-hunderds в Интернете, вы узнаете, что код для «1'-ASCII-Charakter» - 31h. Следовательно, вам нужно отправить 3131h к терминалу:

0011 0001 0011 0001 (binary) 
    3 1 3 1 (hex) 
       12593 (decimal) 

Хитрость, чтобы сделать это, является путем деления 11 (1011) от 10 с div инструкцией. После деления на 10 вы получаете результат и остаток. вам нужно преобразовать остаток в ASCII-номер, который нужно сохранить в буфер. Затем повторите процесс, снова разделив результат с последнего шага на 10. Вы должны сделать это, пока результат не равен 0. (используя div операции немного сложнее Вы должны искать это самостоятельно.)

двоичных (десятичный):
разделяя 1011 (11) 1010 (10):
результат: 0001 (1) Остаток: 0001 (1) -> преобразовать remainderto ASCII-
разделить результат на 1010 (10) снова:
результат: 0000 (1) Остаток: 0001 (1) -> преобразовать остаток до ASCII

+0

Ты лучший .... Хотя, я не делал этого сложного расчета, но так, как ты научил меня, эти вещи были фантастическими .... – Piyush

+0

Эй, Блехдоз, у меня есть еще одна проблема, отредактированная в вопросе ... Справка Plz с этим. – Piyush

+0

Вы должны задать новый вопрос для этой совершенно другой проблемы. Я не могу проверить ваш код, и я не знаком с сборкой окон, потому что я использую сборку linux. Я не знаю, как обрабатываются прерывания Windows.По крайней мере, в Linux вы не можете поместить значение, которое хотите распечатать, через прерывание непосредственно в регистр. Вместо этого вы помещаете адрес/переменную, где значение сохраняется, в регистр. – Blechdose