汇编寄存器算术?

时间:2016-07-31 14:37:23

标签: c assembly pointer-arithmetic

当您在汇编时使用MOV和LEA指令时,有人写道时它的真正含义是什么:

   mov DWORD PTR [esp+4], 0x80484c 
   lea eax,[ebp-40]

具体来说,当他们在括号[]中写入信息时。我知道lea移动地址和移动内容,但是当他们用lea或mov计算地址时,它实际上是如何工作的?它与C中的指针算法相同吗?

2 个答案:

答案 0 :(得分:4)

lea 移动地址,计算有效地址并将结果地址存储到目标寄存器中。地址计算使用常规算法以机器语言执行,而不是C指针算法。

lea eax,[ebp-40]

从寄存器40中的值中减去ebp,并将结果存储在寄存器eax中。

mov DWORD PTR [esp+4], 0x80484c

通过将4添加到寄存器esp中包含的值来计算目标地址,并将值0x80484c(整数8407116)存储为占用4的32位整数该地址的字节数,最低有效字节数。

答案 1 :(得分:2)

lea只计算一个表达式并将其保存到变量中。它实际上并没有对内存或内存地址做任何事情,即使它被命名为“加载有效地址”。

例如lea eax,[ebp-40]表示eax = ebp - 40

它可用于计算表达式,否则这些表达式将需要多个指令,例如:

lea eax, [8 * eax + ebx + 10]

用一条指令计算eax = 8 * eax + ebx + 10

另一方面mov,当与[...]一起使用时,从/向内存读取/写入内容,所以它有点像使用C指针。

mov DWORD PTR [esp+4], 0x80484c

这将32位无符号整数(DWORD)值0x80484c保存到内存位置esp + 4,即与伪C相同:

*((uint32_t*)(esp + 4)) = 0x80484c;