【问题标题】:What value is in EAX after execution of each instruction?执行每条指令后,EAX 中的值是多少?
【发布时间】:2014-03-11 19:03:43
【问题描述】:

我试图通过 MASM32 程序中代码的每个 sn-p 来跟踪 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, alfa 时,它会将alfa 移动到 EAX 寄存器中,AL 不是 8 位寄存器吗?为什么这样做?为什么WriteInt 说值是+150?
  2. MOVZXMOVSX 做什么?
  3. MOVZX EAX, alfa 有什么作用?值都没有改变吗?
  4. MOVSX EAX, alfa,为什么是-106和EAX寄存器FFFFFF96?是因为它是负面的吗?

【问题讨论】:

  • 每条指令的作用应该在处理器手册中说明。如果处理器手册中有您不明白的地方,请说得更具体。

标签: assembly x86 masm cpu-registers masm32


【解决方案1】:

您将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 没有符号扩展并清除位。

【讨论】:

  • 再次感谢您的帮助!调用 WriteInt 打印 +150 是否有任何原因?
猜你喜欢
  • 2014-04-08
  • 2021-09-24
  • 1970-01-01
  • 2012-08-27
  • 2013-08-20
  • 2020-08-29
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多