执行每条指令后EAX的价值是多少?

时间:2014-03-11 19:03:43

标签: assembly x86 masm cpu-registers masm32

我试图通过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的值。我有一些问题:

  1. MOV AL, alfaalfa移入EAX寄存器时,AL不是8位寄存器吗?它为什么这样做?为什么WriteInt表示该值为+150?
  2. MOVZXMOVSX做了什么?
  3. MOVZX EAX, alfa做什么?这些价值都没有改变?
  4. MOVSX EAX, alfa,为什么是-106和EAX寄存器FFFFFF96?是因为它是否定的?

1 个答案:

答案 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不签署扩展并清除这些位。