IA32汇编:lea指令
我知道我要说的这句话可能是非常快速地在StackOverflow上非常不受欢迎的最佳方式。 无论如何,我会这样说:为什么这不工作(完全)?
我试图弄清楚lea / leal指令的作用 。 按照我的理解,lea / leal找出第一个操作数的内存地址,并将此地址写入第二个操作数(可能是一个寄存器或其他地址)。
这部分似乎工作。 当我运行下面的程序时,它说:
The memory address of var is 134518204.
然而,在此之后它说“内存访问错误”。 pushl(%eax)显然不起作用。 为什么不?
.data
var: .long 42
str1: .string "The memory address of var is %d.n"
str2: .string "At this memory address we find var's value: %d.n"
.text
.global main
main:
leal var, %eax # Copy the address of var into %eax
pushl %eax
pushl $str1
call printf # Print str1
pushl (%eax)
pushl $str2
call printf # Print str2
# Some stack cleaning should be here :)
movl $1, %eax
int $0x80
我甚至不确定我是否正确地使用了哪些文件。 帮助表示赞赏。 ;)
按照我的理解,lea / leal找出第一个操作数的内存地址,并将此地址写入第二个操作数(可能是一个寄存器或其他地址)。
听起来足够准确。 它用于执行地址算术; 这可以像加载地址一样简单,但您也可以使用它来执行某些常量的乘法运算。
pushl (%eax)
显然不起作用。 为什么不?
您的push
指令不引用您认为它的地址: printf
返回写入的字符数,并且该值将返回到%eax
寄存器中,因此%eax
不再包含var
的地址。
lea
通常用于计算:如果你只想在寄存器中使用全局地址, movl $var, %eax
比lea
更清晰(并且字节更短)。
另外,为了说清楚, lea
的目标操作数必须是寄存器。
上一篇: IA32 Assembly: lea instruction
下一篇: what does LEA directive do when only a displacement is used?