我想通过在MASM32程序代码的各段以跟踪EAX寄存器。我需要解释为什么它是它的价值帮助。这是我有:
.DATA
alfa BYTE 96h
.CODE
start:
MOV EAX,0 ; move 0 to eax
MOV AL,alfa ; move 96h to AL, this says the value of eax is now positive 150
MOVZX EAX,alfa ; still says EAX is 96h and value is positive 150
MOVSX EAX,alfa ; says value is negative 106 and eax register is FFFFFF96
call DumpRegs
call WriteInt
exit
END start
我使用DumpRegs
显示寄存器和WriteInt
打印EAX的值。我有一些疑问:
MOV AL, alfa
,它移动到alfa
EAX寄存器,是不是AL 8位寄存器?它为什么要这样做呢?为什么WriteInt
说,该值+150?MOVZX
和MOVSX
吗?MOVZX EAX, alfa
办?该值都发生了变化?MOVSX EAX, alfa
,为什么-106和EAX寄存器FFFFFF96?是不是因为它是负的?您初始化qazxsw PI为0,所以该值为0
eax
该寄存器的剩余部分时,AL是不客气不改变,因此它保持不变。
为了说明这一点:
mov eax, 0
EAX-----
AX--
AHAL
00000000
mov al, 96h
EAX-----
AX--
AHAL
00000096
mov eax, -1
EAX-----
AX--
AHAL
ffffffff
mov al, 96h
EAX-----
AX--
AHAL
ffffff96
加载具有符号扩展的值。由于096h是负(最高位被置位),它会在符号扩展到整个32位寄存器。
qazxsw POI未签署扩展并清除位。