Articles of 调用约定

amd64 psABI在哪里?

AMD64 psABI曾经被x86-64.org托pipe。 我有一个pdf文件的副本,它明确地说: 体系结构规范可在网站http://www.x86-64.org/documentation上find 。 但http://www.x86-64.org已经很长一段时间了。 至less几个月。 有谁知道最新的PSABI可以从哪里拿走?

(x86_64 linux程序集)为什么使用float格式string的printf只能与rsp%0x10 = 0一起工作

我在x86_64 linux汇编程序上写了一个printf调用的问题。 如果我尝试在rsp % 0x10 != 0时打印一个double值,那么printf将会出现段错误。 看看我的代码(nasm语法): [bits 64] global _start extern printf extern pow section .data printf_format db '%lf', 10, 0 section .text _start: mov rbp, rsp sub rsp, MEM_VAL mov rax, 0x4000000000000000 mov qword [rsp], rax movsd xmm0, qword [rsp] mov rdi, printf_format mov rax, 1 call printf mov rax, 60 mov […]

x86-64 SysV ABI中的参数和返回值寄存器的高位允许垃圾吗?

x86-64 SysV ABI指定了函数参数如何在寄存器中传递( rdi第一个参数,然后是rsi等),以及如何传回整数返回值(在rax ,然后在rdx中传递非常大的值)。 但是,我不能find的是当传递小于64位的types时,参数或返回值寄存器的高位应该是什么。 例如,对于以下function: void foo(unsigned x, unsigned y); … x将在rsi以rdi和y传递,但它们只有32位。 rdi和rsi的高32位是否需要为零? 直觉上,我会承认是的,但所有的海湾合作委员会,铛和ICC 生成的代码具有特定的mov指令在开始零高位,所以它似乎编译器假设,否则。 同样,编译器似乎认为,如果返回值小于64位,则返回值rax的高位可能具有垃圾位。 例如,以下代码中的循环: unsigned gives32(); unsigned short gives16(); long sum32_64() { long total = 0; for (int i=1000; i–; ) { total += gives32(); } return total; } long sum16_64() { long total = 0; for (int i=1000; i–; […]

在Windows上__cdecl或__stdcall?

我目前正在开发Windows的C ++库,将作为DLL分发。 我的目标是最大化二进制互操作性; 更确切地说,我的DLL中的函数必须可以从多个版本的MSVC ++和MinGW编译的代码中使用,而无需重新编译DLL。 但是,我很困惑哪个调用约定是最好的, cdecl或stdcall 。 有时我会听到像“C调用约定是唯一一个保证与编译器相同的调用约定”这样的语句,这与“ 对cdecl的解释存在一些变化,特别是在如何返回值中 ”等语句形成对比。 这似乎并不阻止某些库开发人员(如libsndfile )在分发的DLL中使用C调用约定,而没有任何可见的问题。 另一方面, stdcall调用约定似乎是明确的。 据我所知,所有的Windows编译器基本上都需要遵循它,因为它是用于Win32和COM的惯例。 这是基于这样一个假设:没有Win32 / COM支持的Windows编译器不会非常有用。 在论坛上发布的很多代码片段声明函数为stdcall但我似乎无法find明确解释原因的单个post。 这里有太多相互冲突的信息,每次search都会给我不同的答案,这并不能帮助我在两者之间做出决定。 我正在寻找一个清晰的,详细的,辩论的解释,为什么我应该select一个在另一个(或为什么两个是相等的)。 请注意,这个问题不仅适用于“经典”function,而且适用于虚拟成员函数调用,因为大多数客户端代码将通过“接口”,纯虚拟类(以下描述的模式在这里和那里 )与我的DLL接口。

有人可以解释__declspec(裸体)吗?

我正在考虑将用于Windows的脚本引擎移植到Linux; 这是Winamp的可视化平台AVS。 我不确定目前是否有可能。 从我可以告诉代码正在C函数的地址nseel_asm_atan和nseel_asm_atan_end并将它们存储在一个表,它可以在代码执行过程中引用。 我已经看了MS的文档,但我不确定什么__declspec(naked)真的。 文档中提到的prolog和epilog代码是什么? 这与Windows调用约定有关吗? 这是便携式吗? 知道使用类似技术的任何基于Linux的示例? static double (*__atan)(double) = &atan; __declspec ( naked ) void nseel_asm_atan(void) { FUNC1_ENTER *__nextBlock = __atan(*parm_a); FUNC_LEAVE } __declspec ( naked ) void nseel_asm_atan_end(void) {}

调用函数返回结构的约定

对于下面的C代码: struct _AStruct { int a; int b; float c; float d; int e; }; typedef struct _AStruct AStruct; AStruct test_callee5(); void test_caller5(); void test_caller5() { AStruct g = test_callee5(); AStruct h = test_callee5(); } 我得到以下反汇编为Win32: _test_caller5: 00000000: lea eax,[esp-14h] 00000004: sub esp,14h 00000007: push eax 00000008: call _test_callee5 0000000D: lea ecx,[esp+4] 00000011: push ecx […]

可以stdcall有一个可变的参数?

据我所知,只有调用者清理栈约定可以使用可变参数。 顺便说一下,WinApi StringCchPrintfW是这样声明的(我删除了SAL) __inline HRESULT __stdcall StringCchPrintfW( STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat, … ); stdcall可以有一个可变的参数吗?

为什么微软selectstdcall作为他们的API约定?

有没有很好的理由? 他们的内部函数(不导出)也是stdcall约定吗?

x86-64 System V ABI在哪里logging?

x86-64 System V ABI(用于Windows以外的所有应用程序)曾用于生存在http://x86-64.org/documentation/abi.pdf ,但是该网站现在已经从互联网上掉下来了。 这个文件是否有一个新的权威之家?