【发布时间】:2015-04-29 08:10:51
【问题描述】:
我需要将我的字段的地址而不是值从 C 传递给汇编函数,我不知道为什么我最终得到的是值而不是地址。
C 代码:
long n = 1,ret = 0;
fun(&n, &ret);
//the rest is omitted
汇编代码:
.globl fun
fun:
pushq %rbp
movq %rsp, %rbp
movq 16(%rbp), %rax #my n address
movq 24(%rbp), %rbx #my ret address
cmpq $0, %rax
//the rest is omitted
当我使用 gdb 查看 %rax 和 %rbx 的值时,我可以看到我的寄存器中有值:
Breakpoint 1, fun () at cw.s:6
6 movq 16(%rbp), %rax #my n address
(gdb) s
7 movq 24(%rbp), %rbx #my ret address
(gdb) s
9 cmpq $0, %rax
(gdb) p $rax
$1 = 1
(gdb) p $rbx
$2 = 0
我真的看不出我的代码有什么问题。我确信 &n 使 C 传递地址而不是值。我正在遵循此处提供的解决方案,但没有运气。
Calling a C function in assembly
更新:
我在 AMD x86_64 上运行 LXLE(它是 Ubuntu 的一个分支)。使用的编译器是 gcc (Ubuntu 4.8.2-19ubuntu1) 和 GNU assembler (GNU Binutils for Ubuntu) 2.24。我的makefile:
cw: cw.c cw.o
gcc cw.o cw.c -o cw
cw.o: cw.s
as -gstabs -o cw.o cw.s
【问题讨论】:
-
你的函数定义是什么?这只是电话。如果您的定义包含 int,则可能存在指向 int 转换的隐式指针。
-
我会在 C 代码中放置一个断点,然后查看编译器生成的程序集。我的猜测是您在代码中添加了
&s 作为事后的想法,并且不知何故忘记了重新编译 C 代码。 -
尝试
info registers而不是p $rax.. -
如果我没有任何关于 C 函数 fun 的声明/定义怎么办?