x64函数调用约定——MSVC & GCC

传参

MSVC

前4个参数使用rcx、rdx、r8、r9,剩下的参数用栈

GCC

前6个参数使用rdi、rsi、rdx、rcx、r8、r9,剩下的参数用栈。注意rdx、rcx的顺序和MSVC上不一样

caller saved registers

这类寄存器可由子函数自由使用,如果父函数希望子函数执行完后仍然使用原来的值,则由父函数进行保护。

MSVC

RAX, RCX, RDX, R8, R9, R10, R11

GCC

RAX, RSI, RDI, RDX, RCX, R8, R9, 10, R11

callee saved registers

子函数若想使用这些寄存器,应在使用前加以入栈,返回前再出栈恢复它们原先的值。

MSVC

RBX, RBP, RDI, RSI, R12, R13, R14, R15

GCC

RBX, RBP, R12, R13, R14, R15

对比可以看出,主要差别就是GCC多使用了rdi和rsi进行传参。

猜你喜欢

转载自blog.csdn.net/missgya/article/details/84327144
gcc
今日推荐