我试图通过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?是因为它是否定的?答案 0 :(得分:3)
您将eax
初始化为0,因此值为0
mov eax, 0
EAX-----
AX--
AHAL
00000000
mov al, 96h
EAX-----
AX--
AHAL
00000096
当AL被处理时,寄存器的其余部分不会改变,所以它保持不变。
为了说明这一点:
mov eax, -1
EAX-----
AX--
AHAL
ffffffff
mov al, 96h
EAX-----
AX--
AHAL
ffffff96
movesx
使用符号扩展名加载值。由于096h是负的(设置的最高位),它会将符号扩展到整个32位寄存器。
movzx
不签署扩展并清除这些位。