我知道我要说的句子可能是在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。感谢帮助。 ;)
答案 0 :(得分:2)
我理解它的方式,lea / leal找出第一个操作数的内存地址,并将该地址写入第二个操作数(可能是一个寄存器左右)。
听起来很准确。它用于执行地址算术;这可以像加载地址一样简单,但你也可以使用它来执行某些常量的乘法。
pushl (%eax)
显然不起作用。为什么不呢?
您的push
指令未引用您认为的地址:printf
返回写入的字符数,该值在%eax
寄存器中返回,因此{{1 }}不再包含%eax
。
答案 1 :(得分:2)
lea
通常(ab)用于计算:如果您只想在寄存器中使用全局地址,movl $var, %eax
比lea
更清晰(并且字节更短)
另外,为清楚起见,lea
的目标操作数必须是一个寄存器。