Как скопировать 16-битное число из 16-битного регистра в переменную длиной 32 бита в 8086? - PullRequest
1 голос
/ 03 марта 2020

Я хочу скопировать 16-битное число из регистра в 32-битную переменную. Как я могу сделать это в 8086?

1 Ответ

0 голосов
/ 09 апреля 2020

Использование CWD (предлагается в качестве ответа), похоже, не для переменных: https://www.felixcloutier.com/x86/cbw: cwde: cdqe

8086 использует Little Endian, а размер слова в основной памяти равен 8 битам. Итак, предполагая переменную в 32 бита со значением 89ABCDEFh и являясь первой переменной, объявленной в программе (т. Е. Смещение 0 в сегменте данных), она должна go в памяти следующим образом:

DS:0000 -> EF
DS:0001 -> CD
DS:0002 -> AB
DS:0003 -> 89

Передача 8-битного значения регистра в позицию основной памяти (например, MOV [2], AL) перезаписывает только значение в этой позиции памяти. Передача 16-битного значения регистра в позицию основной памяти (например, MOV [2], AX) перезаписывает значение в этой позиции памяти и следующую.

Поэтому, чтобы решить проблему, которую вы запрашиваете, Вы должны сделать это позже, добавив, что [0] и [1] равны 0:

MOV [0], AX   ;Equivalent to MOV [2], AL  and  MOV [3], AH  due to endianness
MOV [2], 0
MOV [3], 0

Более общее решение (когда переменная не является первой объявленной) требует использования LEA, чтобы узнать ее положение в памяти (первая позиция, которую он использует):

LEA SI, var32bits      ; e.g, var32bits dd 89ABCDEFh if you want to see how it is overwrited
MOV AX, 0FFFFh
MOV [SI], AX
MOV [SI+2], 0
MOV [SI+3], 0

Надеюсь, это сработает для вас. Лучший,

(решение ptr, предложенное Питером, быстрее, но я придерживаюсь этого, потому что я думаю, что это более поучительно для людей, изучающих сборку 8086)

...