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 字节对象数组的ecx
th 条目中。
【讨论】:
【参考方案2】:是的,就是这样。在 AT&T 语法中,内存寻址写成:
offset(base, index, multiplier)
offset
是一个有符号常量,指定与base
的偏移量,base
是一个寄存器,说明从哪里开始,index
是一个寄存器,指定在乘法后从数组开始后的距离by multiplier
,可以是 1、2、4 或 8。
您必须至少指定offset
、base
和index
之一。要在不使用 base
的情况下使用 index
,您需要在其前面加上逗号 ((, index)
)。如果不指定multiplier
,则默认为1。
在 Intel 语法中,这写为:
[base + index*multiplier + offset]
这更容易理解,因为它只是一个数学问题。
【讨论】:
以上是关于x86 简单 mov 指令的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )
Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )