推送堆栈位置的地址而不是地址处的值
Push address of stack location instead of the value at the address
我正在处理一个小型编译器项目,我似乎无法弄清楚如何推送堆栈位置的地址而不是该堆栈位置的值。我的目标是推送一个堆栈位置地址,它包含一个整数值,作为指向打印它的 C 函数的空指针。我的最终目标是在函数中做一些指针整数运算。我成功地从运行时库扩展调用了 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 , %esp
movl , %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 , %esp
leave
ret
至于我现在拥有的东西,它会崩溃,因为我正在将值 42
转换为地址。有人可以告诉我一些参考资料或资源以了解更多信息吗?
一般情况下,您可以使用 LEA instruction to get the effective address of -4(%ebp)
and place it in a register. You can then push that register to the stack. The LEA instruction is described in the instruction set reference 以这种方式获取基于堆栈的值的地址:
Computes the effective address of the second operand (the source operand) and stores it in the first operand (destination operand). The source operand is a memory address (offset part) specified with one of the processors addressing modes; the destination operand is a general-purpose register.
在您的代码中,类似这样的代码会起作用:
lea -4(%ebp), %eax
push %eax
这应该有效地传递堆栈上 -4(%ebp)
的地址,供您的函数 print
使用。
我正在处理一个小型编译器项目,我似乎无法弄清楚如何推送堆栈位置的地址而不是该堆栈位置的值。我的目标是推送一个堆栈位置地址,它包含一个整数值,作为指向打印它的 C 函数的空指针。我的最终目标是在函数中做一些指针整数运算。我成功地从运行时库扩展调用了 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 , %esp
movl , %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 , %esp
leave
ret
至于我现在拥有的东西,它会崩溃,因为我正在将值 42
转换为地址。有人可以告诉我一些参考资料或资源以了解更多信息吗?
一般情况下,您可以使用 LEA instruction to get the effective address of -4(%ebp)
and place it in a register. You can then push that register to the stack. The LEA instruction is described in the instruction set reference 以这种方式获取基于堆栈的值的地址:
Computes the effective address of the second operand (the source operand) and stores it in the first operand (destination operand). The source operand is a memory address (offset part) specified with one of the processors addressing modes; the destination operand is a general-purpose register.
在您的代码中,类似这样的代码会起作用:
lea -4(%ebp), %eax
push %eax
这应该有效地传递堆栈上 -4(%ebp)
的地址,供您的函数 print
使用。