用匯編實現add函式
平臺
- macOS
工具
- nasm
- clang
檔案
- main.c
#include <stdio.h>
int add(int a, int b);
int main() {
printf("the reuslt of 2 plus 3 is %d\n", add(2, 3));
return 0;
}
- add.asm
; 宣告給linker, 這樣才能連線上該函式
global add
section .data
section .text
add:
; 這兩句在所有函式中都是必須的, 功能就是將從父函式的棧切換到子函式的棧
push rbp
mov rbp, rsp
; 在macOS中函式引數的傳遞的順序是--> 見下面
mov rax, rdi ; 獲取第一個引數
add rax, rsi ; 獲取第二個引數, 函式的返回值放在rax中
leave ; 作用: 將棧清除並還原(清除子函式的棧, 恢復父函式的棧, **注意: 子函式的棧用來存放區域性變數**), 相當於
; mov esp, ebp
; pop ebp
ret
- 函式引數傳遞的順序
mov rdi,strformat ;第一個引數
mov rsi,1 ;第二個引數
mov rdx,2 ;第三個引數
mov rcx,3 ;第四個引數
mov r8,4 ;第五個引數
mov r9,5 ;第六個引數
mov dword [rsp],6 ;第七個引數
mov dword [rsp+8],7 ;第八個引數
mov dword [rsp+16],8 ;第九個引數
mov dword [rsp+24],9 ;第十個引數
編譯
- nams -f macho64 --prefix _ add.asm
連結
- clang main.c add.o -o main
相關文章
- 不使用日期函式實現ADD_MONTHS函式功能函式
- add(1)(2)(3)...函式的實現函式
- 不使用日期函式實現ADD_MONTHS函式功能(二)函式
- 用匯編來實現OOP (轉)OOP
- [譯] 編寫函式式的 JavaScript 實用指南函式JavaScript
- 用表函式實現OTOP 工具函式
- (函式)實現strstr函式函式
- 建構函式與new的彙編實現函式
- Sanic add_route() 方法/函式函式
- Sanic add_task()方法/函式函式
- js函式add(1)(2)(3)(4)...實現無限極累加原理解析JS函式
- 用Map+函式式介面來實現策略模式函式模式
- 用ORACLE分析函式實現行列轉換Oracle函式
- VS在 x64 編譯環境下使用匯編函式編譯函式
- Sanic add_websocket_route() 方法/函式Web函式
- 為什麼objc_msgSend必須用匯編實現OBJGse
- 用函式正規化實現戰略模式函式模式
- 用雲函式快速實現圖片爬蟲函式爬蟲
- 用虛擬函式實現事件驅動! (轉)函式事件
- 用函式實現模組化程式設計一函式程式設計
- 用函式實現模組化程式設計二函式程式設計
- 用函式實現模組化程式設計三函式程式設計
- Python add()函式是如何使用呢?Python函式
- 用TypeScript編寫釋出函式庫TypeScript函式
- MySQL排名函式實現MySql函式
- MySQL分析函式實現MySql函式
- fcntl函式實現dup函式
- 用 splice函式分別實現 push、pop、shift、unshi函式
- 用函式實現模組化程式設計習題函式程式設計
- sqlldr匯入日期函式SQL函式
- JavaScript的迭代函式與迭代函式的實現JavaScript函式
- 函式節流、函式防抖實現原理分析函式
- 實用函式式 Java (PFJ)簡介函式Java
- ORACLE 實用函式總結Oracle函式
- async 函式的實現原理函式
- 去抖函式的實現函式
- Golang實現PHP常用函式GolangPHP函式
- Go實現PHP常用函式GoPHP函式