Язык ассемблера: байты памяти и смещения - PullRequest
0 голосов
/ 22 сентября 2011

Я не совсем понимаю, как хранится память при объявлении переменных на ассемблере.У меня есть этот блок примера кода:

val1  db  1,2
val2  dw  1,2
val3  db  '12'

Из моего учебного пособия говорится, что общее количество байтов, необходимых в памяти для хранения данных, объявленных этими тремя определениями данных, составляет 8 байтов (в десятичном виде),Как мне рассчитать это?

Также сказано, что смещение в сегменте данных val3 составляет 6 байтов, а шестнадцатеричный байт со смещением 5 равен 00. Я потерян каккак вычислить эти байты и смещения.

Кроме того, чтение val1 в память даст 0102, но чтение val3 в память даст 3132. Являются ли апострофы, представленные 3или откуда это взялось?Как val2 будет считан в память?

Ответы [ 2 ]

5 голосов
/ 22 сентября 2011

У вас есть два байта, 0x01 и 0x02. Пока это два байта.

Тогда у вас есть два слова, 0x0001 и 0x0002. Это еще четыре байта, что делает шесть на сегодняшний день.

У вас есть еще два байта, составляющие символы строки '12', которые 0x31 и 0x32 в ASCII (a) . Это еще два байта, доведя общее количество до восьми.

В формате с прямым порядком байтов (это то, на что вы смотрите здесь, основываясь на значениях памяти ваших состояний вопроса), они хранятся как:

offset  value
------  -----
     0   0x01
     1   0x02
     2   0x01
     3   0x00
     4   0x02
     5   0x00
     6   0x31
     7   0x32

(a) Набор символов, который вы используете в этом случае, - ASCII (вы можете перейти по этой ссылке для таблицы, описывающей все символы в этом наборе).

Значения байт 0x30 через 0x39 представляют собой цифры от 0 до 9, так же как байты 0x41 через 0x5A представляют буквенные символы верхнего регистра. Псевдооператор:

db '12'

говорит вставить байты для символов '1' и '2'.

Аналогично: * * одна тысяча сорок четыре

db 'Pax is a really cool guy',0

даст вам представление в виде шестнадцатеричного дампа:

addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  +0123456789ABCDEF
0000  50 61 78 20 69 73 20 61 20 72 65 61 6C 6C 79 20   Pax is a really 
0010  63 6F 6F 6C 20 67 75 79 00                        cool guy.
3 голосов
/ 22 сентября 2011

val1 - это два последовательных байта, 1 и 2. db означает «прямой байт». val2 - это два последовательных слова, то есть 4 байта, снова 1 и 2. в памяти они будут 1, 0, 2, 0, предполагая, что вы находитесь на машине с прямым порядком байтов. val3 - это строка из двух байтов. 31 и 32 in - это 49 и 50 в шестнадцатеричном формате, они являются кодами ASCII для символов «1» и «2».

...