对于少于四个参数的函数是否需要保留堆栈空间?
刚刚开始学习 x64 汇编,我有一个关于函数、参数和堆栈的问题。据我了解,函数中的前四个参数在 Windows 中传递给 rcx、rdx、r8 和 r9 寄存器(以及用…
为什么我可以通过带有太多参数的指针调用函数?
假设我有这个函数: int func2() { printf("func2\n"); return 0; } 现在我声明一个指针: int (*fp)(double); 它应该指向一个接受 double 参数并返回…
__stdcall 名称修饰的语法是什么?
我有一个程序调用一组函数,如下所示: int _stdcall VB_Create(char*); int _stdcall VB_Open(unsigned int, unsigned int, unsigned int, unsigned …
C 如何返回结构体?
(gdb) disas func Dump of assembler code for function func: 0x00000000004004b8 : push %rbp 0x00000000004004b9 : mov %rsp,%rbp 0x0000000000400…
Windows 上的 __cdecl 或 __stdcall?
我目前正在为 Windows 开发一个 C++ 库,它将作为 DLL 分发。我的目标是最大化二进制互操作性;更准确地说,我的 DLL 中的函数必须可以从使用多个版本…
函数参数列表中的函数调用是否会加深堆栈?
调用 F(argument_expression) 时,是否在将 F 压入堆栈之前评估 argument_expression? 例如,当调用F(G(H(arg)))时,编译器是否首先将H压入堆栈,计…
为什么 Windows x64 调用约定不使用 XMM 寄存器来传递 4 个以上的整数参数?
(Microsoft) x64 调用约定状态: 参数在寄存器 RCX、RDX、R8 和 R9 中传递。如果参数是 float/double,则它们将在 XMM0L、XMM1L、XMM2L 和 XMM3L 中传…
为什么 %eax 在调用 printf 之前被清零?
我正在尝试使用一点 x86。我正在 64 位 mac 上使用 gcc -S -O0 进行编译。 C 中的代码: printf("%d", 1); 输出: movl $1, %esi leaq LC0(%rip), %rd…
在c中可以用不同的调用约定定义函数吗?
int _cdecl f (int x) { return 0; } int _stdcall f (int y) { return 0; } 名称修改后将是: _f _f@4 哪个不冲突,这在 c 中允许吗?如果不允许,为…
Win VS2008调用约定:来自c的Delphi dll
从 ac 应用程序(VS2008,Win)中,我调用 Borland 中用 Delphi 编写的 dll 中的函数。该函数可以工作,但每次调用后我都会收到此错误:“ESP 的值未…