Представление чисел (память и синтаксис) - Assembler
Формулировка задачи:
1) В одной спецификации увидел вот такое написание числа: 0FFFFh (речь идёт об окончании массива word'ов)Теперь в памяти находится следующее: начало (low) Если же я решу "забрать" число "подвубайтно", в 2 этапа, то получится, что более ближнее "слово" (логично, что оно должно быть и более "low'ное") окажется более "старшим":
Логически в голове возникает образ 0x00004433 & 0x22110000 (ax & bx), что действительности не соответствует. И для правильного результата я должен начать извлекать 2-байтные части, либо начиная с дальнего, либо сначала заполняя старший регистр.
А что чтобы не противоречить логике, мне нужно забирать "слова" по "двусловному" выравниванию, но в "однословном" объёме, чего процессором НЕ ПРЕДУСМОТРЕНО. Если я, конечно, нигде не ошибаюсь. Выглядело бы это примерно так:
Второй "весёлый" момент заключается в том, что сами байты внутри себя вовсе не переворачиваются (то бишь 2 разряда в байте).
Таким образом, мы имеет абсолютно страшную картину:
число
Внимание, вопрос: зачем вначале стоит ноль?
2) Когда мы записываем значение регистра в память, то оно может сохраняться по-разному (big-endian / little-endian). Но к этому добавляется ещё и считывание в регистры с префиксами byte/word/dword/... Таким образом, обратный (встречается чаще) порядок байтов переворачивается ещё дополнительно. Например, я записал число44332211
(т. е. пометил старшие адреса бОльшими цифрами, для наглядности) в регистр, и далее - в память:mov eax, 0x44332211 mov dword [startofnumber], eax
--> || 44 | 33 | 22 | 11 || <--
конец (high) Если мы "возьмём" число обратно в регистр в объёме 4 байт, то получим такое же число:mov eax, dword [startofnumber]; eax= 0x44332211
mov ax, word [startofnumber]; более ближнее в памяти - 0x4433 mov bx, word [startofnumber + 2]; более дальнее в памяти - 0x2211
mov eax, word of dword [startofnumber]
D-4-C-3-B-2-A-1
, при условии, что мы занесли его "одним махом", сидит в памяти как: начало (low)--> || D-4-C-3-B-2-A-1 || <--
конец (high) (вместо более логичного 1-A-2-B-3-C-4-D...)Внимание, вопрос: как тут не сойти с ума?
Решение задачи: «Представление чисел (память и синтаксис)»
textual
Листинг программы
mov ax, low [startofnumber] mov bx, high [startofnumber]
Объяснение кода листинга программы
mov ax, low [startofnumber]
- в данном коде происходит перемещение содержимого регистра AX в память по адресуlow [startofnumber]
. Здесьlow
- это указание на младший байт числа, аstartofnumber
- это адрес начала числа в памяти.mov bx, high [startofnumber]
- в данном коде происходит перемещение содержимого регистра BX в память по адресуhigh [startofnumber]
. Здесьhigh
- это указание на старший байт числа, аstartofnumber
- это адрес начала числа в памяти.