1. 程式人生 > >x64函式呼叫約定——MSVC & GCC

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進行傳參。