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



我正在从事一个小型编译器项目,我似乎无法弄清楚如何按下堆栈位置的地址,而不是该堆栈位置的值。我的目标是推动具有整数值的堆栈位置地址,作为通往打印C函数的空隙指针。我的最终目标是在功能中执行一些指针 - 算手算术。我成功地从运行时库扩展程序调用C函数,但是问题只是弄清楚如何在汇编中推动地址。

我的C功能。

void print(void* ptr){
    int* int_ptr = (int*)ptr;
    printf("*int_ptr is %dn",*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扔到地址。有人可以将我带到一些参考或资源以了解更多信息吗?

通常,您可以使用 lea 指令获得基于堆栈的值的地址,以获取-4(%ebp)的有效地址并将其放置在寄存器中。然后,您可以将该寄存器推入堆栈。 lea 指令在说明集参考中描述:

计算第二操作数(源操作数)的有效地址,并将其存储在第一操作数(目标操作数)中。源操作数是用一个处理器之一指定的内存地址(偏移零件)。目的地操作数是通用寄存器。

在您的代码中,类似这样的事情会有效:

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

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

最新更新