2015-10-21 28 views
5

如何在下面的例子中的汇编指令MOVSX工作:MOVSX装配说明如何工作?

MOVSX ECX,BYTE PTR DS:[EDX]

在这种情况下,这里有寄存器的状态:
ECX = 0000000F
EDX = 0012FD9F

从我的想法,它需要[EDX] = 9F的最后几个字节,将其移至ECX,然后将符号扩展为匹配16位= 0000009F。但是,实际结果是00000016.有人可以帮助解释我错在哪里吗?

回答

4

这是部分正确的。但是:

BYTE PTR DS:[EDX]获得位于EDX中保存的地址的字节。该字节被复制到ECX到最低有效字节中,其余部分填充字节的符号。

对于您的意外结果,这意味着在内存地址 0x12FD9F字节0x16位于。


注:

  • 的段覆盖前缀DS:是没有必要在这里。 [EDX]自动参考DS

“内存地址”指的是虚拟的还是这里的物理内存

1

许多英特尔/ AMD的x86指令是“modrm”格式提供 - 他们有两个操作数,其中一个必须是一个寄存器,另一个寄存器或内存引用,其地址由指令编码的modrm字节确定,可能还包括指令的后续字节,如sib(缩放索引字节) ,以及立即的常量/内存偏移量。还有一个可能的段前缀字节。

通常这些REG,REG/MEM指令,所述形式

rsrcdst += rsrc 
or 
    rsrcdst += Memory[ ... addressessing mode ...] 

但x86汇编代码的不具有独立的操作码/指令助记符了reg,REG和reg,这些指令的MEM形式。在汇编程序中,通过汇编语法指示操作数是寄存器还是存储器位置。

在这种情况下,汇编代码是

MOVSX ECX,BYTE PTR DS:[EDX]

的指令操作码是MOVSX。

目标操作数是寄存器ECX。

源操作数是“BYTE PTR DS:[EDX]”。这是一个内存引用有以下几点:(1)围绕“[EDX]”的方括号 - 方括号是Memory [...]的简写形式地址...]。 (2)“DS:”前缀,表示它在数据段中。寄存器操作数没有这样的段前缀。 (3)“BYTE PTR” - 表示“采用由'DS:[EDX]'指定的存储器地址,并将其解释为引用存储器中的8位字节”。

我怀疑你真正想要的是

MOVSX ECX,DL 

“DL”是注册EDX 32位的低8位的名称。即DL = EDX.bits [7:0]。不幸的是,X86的汇编器通常不;吨接受语法像“EDX.bits [7:0]”(除非我写他们),所以你必须知道子寄存器的历史名称:

AL = EAX.bits[7:0] 
AH = EAX.bits[15:8] 
AX = EAX.bits[15:0] 
EAX = 32 bit register that "covers" all of the above 

等上:BL,CL,DL,DI,...