【发布时间】:2016-05-30 06:15:27
【问题描述】:
当我使用 mov 和 lea 获取地址时,它们到底有什么区别?
假设我有一个程序打印出从第 5 个字符开始的字符串,其代码如下所示:
section .text
global _start
_start:
mov edx, 0x06 ;the length of msg from its 5th char to the last is 6.
lea ecx, [msg + 4]
mov ebx, 1
mov eax, 4
int 0x80
section .data
msg db '1234567890'
那么,如果我将lea ecx, [msg + 4] 换成mov ecx, msg + 4,它的运行方式会有所不同吗?
我都试过了,结果似乎是一样的。但是,我在第一个答案的评论部分从这个链接What's the purpose of the LEA instruction? 读到,似乎有人声称mov ecx, msg + 4 之类的东西无效,但我没看到。有人可以帮助我理解这一点吗?提前致谢!
【问题讨论】:
-
@Mysticial:这当然是有效的 NASM 语法。
-
@glenjoker:
mov的编码更短,但lea更灵活,因为它允许您执行lea ecx, [msg + eax*4]之类的操作。 -
@Mysticial:不,您正在考虑 MASM 语法,它 无效。在 NASM 语法中,它是一个直接常量。 (MASM:
mov ecx, OFFSET msg + 4什么的)。链接器重定位允许符号+位移,因此symbol + 4仍然是链接时间常数。完全相同的事情发生在为LEA的有效地址生成 4B 位移。 -
@PeterCordes: 嗯,MASM 语法中的
mov ecx, msg+4与mov ecx, [msg+4]的含义不一样吗?我有一段时间没有使用 MASM/TASM,但我记得是这样的。 -
mov reg, label+imm无论如何都用 MASM 6.14 为我组装。我没有费心去看它组装成什么到。