推送堆栈位置的地址而不是地址的值

时间:2017-12-09 20:14:40

标签: c gcc assembly gas att

我正在开发一个小型编译器项目,我似乎无法弄清楚如何推送堆栈位置的地址而不是该堆栈位置的值。我的目标是将一个包含整数值的堆栈位置地址作为指向打印它的C函数的void指针。我的最终目标是在函数中做一些指针整数运算。我成功地从运行时库扩展中调用了C函数,但问题只是弄清楚如何在汇编中推送地址。

我的C功能。

void print(void* ptr){
    int* int_ptr = (int*)ptr;
    printf("*int_ptr is %d\n",*int_ptr);
}

我的大会

.globl main
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp

movl $42, %eax
movl %eax, -4(%ebp)

pushl -4(%ebp) 
//Instead of the value at -4(%ebp), I would like the address of -4(%ebp)
call print

addl $8, %esp
leave
ret

至于我现在拥有的内容,因为我将值42转换为地址,所以它会崩溃。有人可以指导我参考或资源以了解更多信息吗?

1 个答案:

答案 0 :(得分:3)

通常,您可以使用LEA指令获取基于堆栈的值的地址,以获取-4(%ebp)的有效地址并将其放入寄存器中。然后,您可以将该寄存器推送到堆栈。 LEA 指令以instruction set reference这种方式描述:

  

计算第二个操作数(源操作数)的有效地址,并将其存储在第一个操作数(目标操作数)中。源操作数是用一个处理器寻址模式指定的存储器地址(偏移部分);目标操作数是通用寄存器。

在你的代码中,这样的东西会起作用:

lea -4(%ebp), %eax
push %eax

这应该有效地传递堆栈上-4(%ebp)的地址,供您的函数print使用。