MOVSX装配说明如何工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MOVSX装配说明如何工作?相关的知识,希望对你有一定的参考价值。

汇编指令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“内存地址”指的是虚拟或物理内存

另一答案

许多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]”周围的方括号 - 方括号是Memory [... address ...]的简写。 (2)“DS:”前缀,表示它在数据段中。寄存器操作数没有这样的段前缀。 (3)“BYTE PTR” - 表示“取'DS:[EDX]'指定的存储器地址,并将其解释为引用存储器中的8位字节”。

我怀疑你真正想要的是什么

MOVSX ECX,DL

“DL”是32位寄存器EDX的低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,......

以上是关于MOVSX装配说明如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

stosd 在装配中是如何工作的?

如何使用 Inventor API 和 Python 访问装配体中出现的工作平面

哈斯克尔。我很困惑这个代码片段是如何工作的

汇编movsx和movzx的区别

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

SpringBoot自动装配流程源码分析