汇编寄存器算术?
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;
当你在汇编中同时使用 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;