x86 简单 mov 指令

Posted

技术标签:

【中文标题】x86 简单 mov 指令【英文标题】:x86 simple mov instruction 【发布时间】:2011-09-22 16:46:02 【问题描述】:

这是一个简单的问题,但我在谷歌上找不到可靠的答案。

这条指令是什么意思:

movl %eax, (%esi, %ecx, 4)

是否将寄存器eax的值移动到内存中(%esi, %ecx, 4)指向的值?

(%esi, %ecx, 4) 用于数组。所以这意味着 Array[Xs + 4i] 其中 Xs 是 Array 在内存中的起点,而 i 只是整数数组中的偏移量。

【问题讨论】:

只有一件事:代码并不暗示 eax 代表一个整数数组。它可能是一个指针向量。否则,是:源第一,目的地第二。总是令人困惑,因为英特尔/微软反其道而行之。 【参考方案1】:

完全正确。这是 AT&T 语法,因此源在前,然后是目标。因此,它将eax 寄存器的内容存储到内存位置esi + 4*ecx

如果您喜欢将此视为一个数组,它会将eax 存储到基于esi 的4 字节对象数组的ecxth 条目中。

【讨论】:

【参考方案2】:

是的,就是这样。在 AT&T 语法中,内存寻址写成:

offset(base, index, multiplier)

offset 是一个有符号常量,指定与base 的偏移量,base 是一个寄存器,说明从哪里开始,index 是一个寄存器,指定在乘法后从数组开始后的距离by multiplier,可以是 1、2、4 或 8。

您必须至少指定offsetbaseindex 之一。要在不使用 base 的情况下使用 index,您需要在其前面加上逗号 ((, index))。如果不指定multiplier,则默认为1。

在 Intel 语法中,这写为:

[base + index*multiplier + offset]

这更容易理解,因为它只是一个数学问题。

【讨论】:

以上是关于x86 简单 mov 指令的主要内容,如果未能解决你的问题,请参考以下文章

被 x86 MOV 指令迷惑

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )

GNU 汇编器 x86 指令后缀(如“mov.s”中的“.s”)如何工作?

arm指令中mov和ldr有啥区别?

X86中mov和movl指令的区别?我在阅读汇编时遇到了一些麻烦[重复]