IA32大会:lea指令

时间:2013-11-02 15:36:21

标签: assembly ia-32

我知道我要说的句子可能是在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。感谢帮助。 ;)

2 个答案:

答案 0 :(得分:2)

  

我理解它的方式,lea / leal找出第一个操作数的内存地址,并将该地址写入第二个操作数(可能是一个寄存器左右)。

听起来很准确。它用于执行地址算术;这可以像加载地址一样简单,但你也可以使用它来执行某些常量的乘法。


  

pushl (%eax)显然不起作用。为什么不呢?

您的push指令未引用您认为的地址:printf返回写入的字符数,该值在%eax寄存器中返回,因此{{1 }}不再包含%eax

的地址

答案 1 :(得分:2)

lea通常(ab)用于计算:如果您只想在寄存器中使用全局地址,movl $var, %eaxlea更清晰(并且字节更短)

另外,为清楚起见,lea 的目标操作数必须是一个寄存器。