当您在汇编时使用MOV和LEA指令时,有人写道时它的真正含义是什么:
mov DWORD PTR [esp+4], 0x80484c
lea eax,[ebp-40]
具体来说,当他们在括号[]中写入信息时。我知道lea移动地址和移动内容,但是当他们用lea或mov计算地址时,它实际上是如何工作的?它与C中的指针算法相同吗?
答案 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;