Я прочитал книгу Кипа ИРВИНА Язык ассемблера для процессоров x86, и он написал:
Копирование меньших значений в большие
Хотя MOV не может напрямую копировать данные из меньшего операнда в больший, программисты могут найти обходные пути. Предположим, что count (без знака, 16 бит) должен быть перемещен в ECX (32 бита). Мы можем установить ECX в ноль и переместить счетчик в CX:
.data count WORD 1 .code mov ecx,0 mov cx,count
Что произойдет, если мы попробуем тот же подход с целым числом со знаком, равным -16?
.data signedVal SWORD -16 ; FFF0h (-16) .code mov ecx,0 mov cx,signedVal ; ECX = 0000FFF0h (+65,520)
Значение в ECX (+65 520) полностью отличается от -16. С другой стороны, если бы мы сначала заполнили ECX значением FFFFFFFFh, а затем скопировали signedVal в CX, окончательное значение было бы правильным:
mov ecx,0FFFFFFFFh mov cx,signedVal ; ECX = FFFFFFF0h (-16)
Моя проблема с последней частью. Я думаю, что в первой строке кода выше мы должны были написать mov ecx,FFFFFFFFFh
, а не 0FFFFFFFFh. Другими словами, что является ведущим нулем?