汇编寄存器算术?

Assembly Register Arithmetic?

当你在汇编中同时使用 MOV 和 LEA 指令时,有人写的是什么意思:

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

具体来说,当他们把信息写在括号[]里的时候。我知道 lea 移动地址而 mov 移动内容,但是当他们计算 lea 或 mov 中的地址时,这实际上是如何工作的?和C中的指针运算一样吗?

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

lea eax,[ebp-40]

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

mov DWORD PTR [esp+4], 0x80484c

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

lea只是计算一个表达式并将其保存到变量中。它实际上并没有对内存或内存地址做任何事情,即使它被命名为 'load effective address'.

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

它可用于计算需要多条指令的表达式,例如:

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

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

另一方面mov,当与[...]、read/writes一起使用时from/to内存,所以有点像使用C指针。

mov DWORD PTR [esp+4], 0x80484c

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

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