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進行傳參。
相關推薦
x64函式呼叫約定——MSVC & GCC
傳參 MSVC 前4個引數使用rcx、rdx、r8、r9,剩下的引數用棧 GCC 前6個引數使用rdi、rsi、rdx、rcx、r8、r9,剩下的引數用棧。注意rdx、rcx的順序和MSVC上不一樣 caller saved registers 這類暫存器可由子函式自由使用,
常見函式呼叫約定(x86、x64、arm、arm64)
我學習逆向,整理的一些常見的函式呼叫約定反彙編筆記。由於我是新手,肯定有一些疏漏不完善的,我遇到了會實時更新的。 X86 函式呼叫約定 X86 有三種常用呼叫約定,cdecl(C規範)/stdcall(WinAPI預設)/fastcall
Windows x64彙編函式呼叫約定
最近在寫一些字串函式的優化,用到x64彙編,我也是第一次接觸,故跟大家分享一下。 x86:又名 x32 ,表示 Intel x86 架構,即 Intel 的32位 80386 彙編指令集。 x64:表示 AMD64 和 Intel 的 EM64T ,而不包括 IA6
2018/10/03-函式呼叫約定、cdecl、stdcall、fastcall- 《惡意程式碼分析實戰》
cdecl是最常用的約定之一,引數是從右到左按序被壓入棧,當函式完成時由呼叫者清理棧,並且將返回值儲存在EAX中。 stdcall約定是被呼叫函式負責清理棧,其他和cdecl非常類似。 fastcall呼叫約定跨編譯器時變化最多,但是它總體上在所有情況下的工作方式都是相似的。在fastcall
從彙編角度檢視C語言函式呼叫約定【非常有用】
轉自:https://blog.csdn.net/Holmofy/article/details/76094986 為了防止出現不必要的程式碼影響組合語言的檢視,所以程式中不使用任何庫函式,以保持彙編程式碼的簡潔。 這裡所使用的彙編是VC的MASM。 預設函式呼叫方式_
cdecl、stdcall、fastcall、thiscall函式呼叫約定區別 (轉)
在C語言中,假設我們有這樣的一個函式: int function(int a,int b) 呼叫時只要用result = function(1,2)這樣的方式就可以使用這個函式。但是,當高階語言被編譯成計算機可以識別的機器碼時,有一個問題就凸現出來:在CPU中,計算機沒有辦法知道一個函式呼叫需要
cdecl、stdcall、fastcall函式呼叫約定區別
論函式呼叫約定 在C語言中,假設我們有這樣的一個函式: int function(int a,int b) 呼叫時只要用result = function(1,2)這樣的方式就可以使用這個函式。但是,當高階語言被編譯成計算機可以識別的機器碼時,有一個問題就凸現出來:在CPU中
【軟體開發底層知識修煉】二十五 ABI之函式呼叫約定二之函式返回值為結構體時的約定
上一篇文章學習了幾種函式呼叫約定的區別,點選連結檢視上一篇文章:【軟體開發底層知識修煉】二十四 ABI之函式呼叫約定 本篇文章繼續學習函式呼叫約定中,關於函式返回值的問題。當函式返回值為結構體時,函式返回值是如何來傳給呼叫者的。
【軟體開發底層知識修煉】二十四 ABI之函式呼叫約定
上一篇文章學習了Linux環境下的函式棧幀的形成與摧毀。點選連結檢視相關文章:軟體開發底層知識修煉】二十三 ABI-應用程式二進位制介面三之深入理解函式棧幀的形成與摧毀 本篇文章繼續學習ABI介面相關的內容。函式呼叫約定
名字修飾約定和函式呼叫約定
所謂名字修飾約定,就是指變數名、函式名等經過編譯後重新輸出名稱的規則。 比如原始碼中函式名稱為int Func(int a,int b),經過編譯後名稱可能為[email protected]@[email protected]、[email
函式呼叫約定與函式名稱修飾規則(一)
作者:星軌(oRbIt) E_Mail:[email protected] 轉載請註明原作者,否則請勿轉載 使用C/C++語言開發軟體的程式設計師經常碰到這樣的問題:有時候是程式編譯沒有問題,但是連結的時候總是報告函式不存在(經典的L
函式呼叫約定及函式名修飾規則
函式呼叫約定:是指當一個函式被呼叫時,函式的引數會被傳遞給被呼叫的函式和返回值會被返回給呼叫函式。函式的呼叫約定就是描述引數是怎麼傳遞和由誰平衡堆疊的,當然還有返回值。 幾種型別:__stdcall,__cdecl,__fastcall,__thiscall,__n
論函式呼叫約定
在C語言中,假設我們有這樣的一個函式: int function(int a,int b) 呼叫時只要用result = function(1,2)這樣的方式就可以使用這個函式。但是,當高階語言被編譯成計算機可以識別的機器碼時,有一個問題就凸現出來:在CPU中,計算機沒有辦法
ARM函式呼叫約定
1、函式呼叫約定主要涉及引數如何傳遞、返回值如何傳遞、返回地址如何儲存以及不要破壞呼叫函式的上下文。那麼在ARM中,這些約定規則是什麼樣呢? 2、測試程式如下: static int fun_a(uint32_t a, uint32_t b, uint32_t c) {
push、pop及函式呼叫約定
push: 把一個32位的運算元壓入堆疊中。這個操作導致esp被減4。esp被形象地稱為棧頂。我們認為頂部是地址小的區域,那麼,壓入堆疊中資料越多,這個堆疊也就越堆越高,esp也就越來越小。在32位平臺,esp每次減少4位元組。 pop: 相反,esp被加4,一個數據
函式的呼叫約定
函式的呼叫約定 1、_cdecl C標準呼叫約定 2、_stdcall windows標準呼叫約定 3、_fastcall 快讀呼叫約定 4、_thiscall 成員方法呼叫約定(本次不做詳解) 那麼函式的呼叫約定
MSVC X64 函式中的 RSP, RBP 和 Calling Convention
上一篇 博文提到了 X64 下 MSVC 如何傳遞引數,但是沒有涉及到當引數個數大於 4 的時候如何分配記憶體空間的問題,接下來我們來探究這個問題。 RSP 和 RBP 按照上面提到的博文,我們進行如下實驗: 所有引數都是 struct Arg, 並
Python 函式呼叫&定義函式&函式引數
一.函式呼叫 就拿abs()函式來舉例 用來返回數值的絕對值 >>> abs(-5)5 二.定義函式 我們可以通過def 來自定義函式,格式為 def 函式名(引數): 舉一個定義計算兩個數值相乘的函式: def product(x
python定義函式時的引數&呼叫函式時的傳參
一、定義函式: 1、位置引數:直接定義引數 2、預設引數(或者關鍵字引數):引數名 = "預設值" 3、位置引數必須在預設引數之前 二、呼叫函式: 1、按位置傳,直接寫引數的值 2、按關鍵字傳,關鍵字 = "值" 3、位置引數必須在關鍵字引數之前 4
C&C++函式呼叫過程
呼叫函式主要關注三個方面分別是函式名,返回值和引數列表,我接下來將會深入底層講解呼叫函式的過程。 呼叫函式的過程主要有四方面,①函式引數代入,②函式棧幀開闢,③函式返回值,④函式棧幀回退 首先來看一段簡單的c檔案程式碼,和它的彙編碼,只需簡單瀏覽即可: 原始碼: int fun1(i