Представление чисел (память и синтаксис) - Assembler

Узнай цену своей работы

Формулировка задачи:

1) В одной спецификации увидел вот такое написание числа: 0FFFFh (речь идёт об окончании массива word'ов)

Внимание, вопрос: зачем вначале стоит ноль?

2) Когда мы записываем значение регистра в память, то оно может сохраняться по-разному (big-endian / little-endian). Но к этому добавляется ещё и считывание в регистры с префиксами byte/word/dword/... Таким образом, обратный (встречается чаще) порядок байтов переворачивается ещё дополнительно. Например, я записал число

44332211

(т. е. пометил старшие адреса бОльшими цифрами, для наглядности) в регистр, и далее - в память:
mov eax, 0x44332211
mov dword [startofnumber], eax
Теперь в памяти находится следующее: начало (low)

--> || 44 | 33 | 22 | 11 || <--

конец (high) Если мы "возьмём" число обратно в регистр в объёме 4 байт, то получим такое же число:
mov eax, dword [startofnumber]; eax= 0x44332211
Если же я решу "забрать" число "подвубайтно", в 2 этапа, то получится, что более ближнее "слово" (логично, что оно должно быть и более "low'ное") окажется более "старшим":
mov ax, word [startofnumber]; более ближнее в памяти - 0x4433
mov bx, word [startofnumber + 2]; более дальнее в памяти - 0x2211
Логически в голове возникает образ 0x00004433 & 0x22110000 (ax & bx), что действительности не соответствует. И для правильного результата я должен начать извлекать 2-байтные части, либо начиная с дальнего, либо сначала заполняя старший регистр. А что чтобы не противоречить логике, мне нужно забирать "слова" по "двусловному" выравниванию, но в "однословном" объёме, чего процессором НЕ ПРЕДУСМОТРЕНО. Если я, конечно, нигде не ошибаюсь. Выглядело бы это примерно так:
mov eax, word of dword [startofnumber]
Второй "весёлый" момент заключается в том, что сами байты внутри себя вовсе не переворачиваются (то бишь 2 разряда в байте). Таким образом, мы имеет абсолютно страшную картину: число

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]

Объяснение кода листинга программы

  1. mov ax, low [startofnumber] - в данном коде происходит перемещение содержимого регистра AX в память по адресу low [startofnumber]. Здесь low - это указание на младший байт числа, а startofnumber - это адрес начала числа в памяти.
  2. mov bx, high [startofnumber] - в данном коде происходит перемещение содержимого регистра BX в память по адресу high [startofnumber]. Здесь high - это указание на старший байт числа, а startofnumber - это адрес начала числа в памяти.

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы