Как работает инструкция по сборке MOVSX?

как инструкция по сборке MOVSX работа в следующем примере:

MOVSX ECX,BYTE PTR DS:[EDX]

В этом случае, вот состояние регистров:

ECX = 0000000F   
EDX = 0012FD9F 

из того, что я думал, он принимает последние байты [EDX] = 9F, перемещает его в ECX, а затем знак расширяет его, чтобы соответствовать 16 битам = 0000009F. Однако фактический результат-00000016. Кто-нибудь может объяснить, в чем я ошибаюсь?

2 ответов


это частично правильно. Однако:

BYTE PTR DS:[EDX] получает байт, расположенный по адресу, указанному в EDX. Этот байт копируется в ECX в наименее значимый байт, а остальное заполняется со знаком байт.

для вашего неожиданного результата это означает, что по адресу памяти10x12FD9F байт - это.


Примечания:

  • префикс переопределения сегмента DS: здесь нет необходимости. [EDX] автоматически относится к DS.

1 "адрес памяти" относится к виртуальной или физической памяти здесь


многие инструкции Intel / AMD x86 доступны в формате "modrm" - они имеют два операнда, один из которых должен быть регистром, другой из которых может быть регистром или ссылкой на память, адрес которой определяется байтом modrm кодировки инструкции и, возможно, последующими байтами инструкции, такими как sib (масштабированный байт индекса) и немедленное смещение константы / памяти. А также по возможному сегменту префикса byte.

обычно это reg, reg/mem инструкции, формы

   rsrcdst += rsrc
or
   rsrcdst += Memory[ ... addressessing mode ...]

но код сборки x86 не имеет отдельных кодов операций / мнемоники инструкций для форм reg,reg и reg,mem этих инструкций. Является ли операнд регистром или ячейкой памяти, указывается в ассемблере синтаксисом сборки.

в этом случае ваш код сборки

MOVSX ECX, БАЙТ PTR DS: [EDX]

код операции инструкции-MOVSX.

операнд назначения-register Экс.

исходный операнд - " BYTE PTR DS: [EDX]". То, что это ссылка на память, указывается несколькими вещами: (1) квадратные скобки вокруг "[EDX]" - квадратные скобки являются сокращением для памяти[...адрес...]. (2) префикс "DS:", который указывает, что он находится в сегменте данных. Регистровые операнды не имеют такого префикса сегмента. (3) "байт PTR" - который говорит: "Возьмите адрес памяти, указанный "DS: [EDX]", и интерпретируйте его как ссылку на 8-битный байт в память."

Я подозреваю, что вы действительно хотите

MOVSX ECX,DL

" DL " -это имя для низких 8 бит 32-битного регистра EDX. Т. е. DL=EDX.биты[7:0]. К сожалению, ассемблеры x86 обычно не принимают синтаксис типа " EDX.биты[7:0]" (если я их написал), поэтому вы должны знать исторические названия регистров суб:

AL = EAX.bits[7:0]
AH = EAX.bits[15:8]
AX = EAX.bits[15:0]
EAX = 32 bit register that "covers" all of the above

и так далее: BL, CL, DL, DI,...