gpt4 book ai didi

C 将值而不是地址传递给汇编函数 (x64)

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:49 26 4
gpt4 key购买 nike

我需要将字段的地址而不是值从 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。我的生成文件:

cw: cw.c cw.o
gcc cw.o cw.c -o cw
cw.o: cw.s
as -gstabs -o cw.o cw.s

最佳答案

您使用的是什么架构?什么编译器生成了 fun 的代码?你自己写的吗?

代码正在使用 r* 寄存器并且您的问题提到了“x64”,所以我假设它是某种 amd64/x86-64/x64 架构。您正在从堆栈中读取内容(您将其评论为“我的 n/ret 地址”),我假设您希望函数参数在那里,但我不知道该 CPU 系列上的任何 ABI将第一个参数传递给堆栈上的函数。

如果你自己写的,你需要阅读你的操作系统/编译器使用的 ABI 的调用约定,因为除非你在一个非常晦涩的操作系统上,否则它不会传递(前几个)函数参数在堆栈上。很可能您只是从堆栈中读取随机值,这些值恰好与您的编译器恰好将值放入调用函数的位置相匹配。

如果您使用的是 Linux 或大多数其他使用 SysV ABI 的类 unix 系统,则函数的前两个参数将位于 rdi、rsi 寄存器中。如果你在 Windows 上,那将是 rcx,rdx。这是假设你的论点是 int/long/pointers。如果参数是结构、 float 等,则适用其他规则。

关于C 将值而不是地址传递给汇编函数 (x64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29937907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com