Ваш код 64-битный.Если вы посмотрите руководство по архитектуре набора команд (ISA) для MOVSXD
, то 64-битный вариант определяется как:
MOVSXD r64, r/m32 Move doubleword to quadword with sign-extension.
Этоинструкция в 64-битном коде, которая принимает 32-битный регистр или адрес в 32-битное значение и перемещает его знак, расширенный в 64-битный регистр.Расширение знака принимает значение самого старшего бита (знакового бита) источника и использует его для заполнения всех старших битов пункта назначения.
movsxd rdx,edx
рассматривает бит 31 (самый старший бит) EDX и устанавливает старшие 32 бита места назначения в это значение и копирует младшие 32 бита как есть.Если бит знака установлен в EDX , то старшие 32 бита 64-битного регистра будут установлены в 1. Если бит знака очищен, старшие 32 бита RDX будут0.
В качестве примера предположим, что EDX имеет значение 0x80000000
.Бит 31 равен 1. Как число со знаком -2147483648
.Если вы сделаете movsxd RDX, EDX
, значение в RDX будет 0xFFFFFFFF80000000
.В качестве 64-разрядного значения со знаком, которое все еще представляет -2147483648
.
Если EDX было 0x7fffffff
(значение со знаком +2147483647
) с битом 31, равным 0, значение в RDX был бы 0x000000007fffffff
, который все еще представляет номер со знаком +2147483647
.Как вы можете видеть, расширение знака сохраняет бит знака в старших битах расширенного регистра, так что сохраняется подпись места назначения.