#include <stdio.h>
#include <stdint.h>
typedef struct {
uint64_t low; // low first, the low half of RDX:RAX
uint64_t high;
} resmul; // x86-64 System V will return this in RDX:RAX, like __int128
resmul mymul(uint64_t, uint64_t); // your function doesn't look for a pointer in RDX
int main() {
resmul res = mymul(3, 6);
printf("mymul(3, 6); res.high=%#lx, res.low=%#lx\n", res.high, res.low);
//mymul(3, 6); res.high=0x0, res.low=0x12
return 0;
}
2条答案
按热度按时间jtw3ybtb1#
你的
mymul
函数在C中声明为接受一个指针参数,它应该把结果存储在内存中,但实际上它把结果留在rdx:rax寄存器中,根本不把任何东西存储在内存中,完全忽略了指针。第三个参数将在rdx寄存器中传递,这会使事情变得有点复杂,因为
mul
会覆盖它。2w3rbyxf2#
您告诉编译器您的函数返回
void
,因此调用者不会查看RDX:RAX。使用调试器和/或查看调用方中的asm;它将从堆栈中加载其未初始化的局部变量
res
,而未写入的堆栈内存恰好为零。要在x86-64 SysV调用约定的RDX:RAX中正确声明一个返回的函数,返回一个结构,或者返回
unsigned __int128
(如果您使用GNU扩展)。Godbolt,还包括编译为相同asm的函数的GNU C实现:
第一次