传参
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进行传参。