MOVSX 汇编指令如何工作?
How does MOVSX assembly instruction work?
汇编指令MOVSX
如何在以下示例中工作:
MOVSX ECX,BYTE PTR DS:[EDX]
在这种情况下,寄存器的状态如下:
ECX = 0000000F
EDX = 0012FD9F
根据我的想法,它需要 [EDX] = 9F 的最后一个字节,将其移动到 ECX,然后对其进行符号扩展以匹配 16 位 = 0000009F。但是,实际结果是00000016,谁能帮我解释一下哪里错了?
部分正确。然而:
BYTE PTR DS:[EDX]
获取位于 EDX 中保存的地址的 字节。此字节被复制到 ECX
到最低有效字节,其余字节用字节的符号填充。
对于您意想不到的结果,这意味着在内存地址 1 0x12FD9F
中找到了字节 0x16
。
备注:
- 此处不需要段覆盖前缀
DS:
。 [EDX]
自动引用 DS
.
1 "memory address"这里指的不是虚拟内存就是物理内存
许多 Intel/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]" 周围的方括号 - 方括号是内存 [...地址...] 的 shorthand。 (2)"DS:"前缀,表示在数据段。寄存器操作数没有这样的段前缀。 (3) "BYTE PTR" - 即 "take the memory address specified by 'DS:[EDX]', and interpret it as referencing an 8-bit byte in memory".
我怀疑你真正想要的是
MOVSX ECX,DL
"DL"是32位寄存器EDX的低8位的名称。 IE。 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、...
汇编指令MOVSX
如何在以下示例中工作:
MOVSX ECX,BYTE PTR DS:[EDX]
在这种情况下,寄存器的状态如下:
ECX = 0000000F
EDX = 0012FD9F
根据我的想法,它需要 [EDX] = 9F 的最后一个字节,将其移动到 ECX,然后对其进行符号扩展以匹配 16 位 = 0000009F。但是,实际结果是00000016,谁能帮我解释一下哪里错了?
部分正确。然而:
BYTE PTR DS:[EDX]
获取位于 EDX 中保存的地址的 字节。此字节被复制到 ECX
到最低有效字节,其余字节用字节的符号填充。
对于您意想不到的结果,这意味着在内存地址 1 0x12FD9F
中找到了字节 0x16
。
备注:
- 此处不需要段覆盖前缀
DS:
。[EDX]
自动引用DS
.
1 "memory address"这里指的不是虚拟内存就是物理内存
许多 Intel/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]" 周围的方括号 - 方括号是内存 [...地址...] 的 shorthand。 (2)"DS:"前缀,表示在数据段。寄存器操作数没有这样的段前缀。 (3) "BYTE PTR" - 即 "take the memory address specified by 'DS:[EDX]', and interpret it as referencing an 8-bit byte in memory".
我怀疑你真正想要的是
MOVSX ECX,DL
"DL"是32位寄存器EDX的低8位的名称。 IE。 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、...