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, %eaxlea更清晰(并且字节更短)。

另外,为了说清楚, lea的目标操作数必须是寄存器。

链接地址: http://www.djcxy.com/p/72389.html

上一篇: IA32 Assembly: lea instruction

下一篇: what does LEA directive do when only a displacement is used?