Я прочитал книгу Кипа Ирвина Assembly Language for x86 Processors и он писал:Ведущий Zero в расширении знака в сборке x86?
Копирование меньших значений к большим
Хотя MOV не может напрямую копировать данные из меньшего операнда большего размера, программисты могут создавать обходные пути. Предположим, что count (unsigned, 16 bits) необходимо перенести в 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, значение NAL фи было бы правильно:
mov ecx,0FFFFFFFFh mov cx,signedVal ; ECX = FFFFFFF0h (-16)
Моей проблема с последней частью. Я думаю, что первая строка в коде выше должна была написать mov ecx,FFFFFFFFFh
, а не 0FFFFFFFFh. Другими словами, что является ведущим нолем?
'mov ecx, -1' должен работать. –