用匯編實現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(1)(2)(3)...函式的實現函式
- [譯] 編寫函式式的 JavaScript 實用指南函式JavaScript
- Sanic add_route() 方法/函式函式
- Sanic add_task()方法/函式函式
- js函式add(1)(2)(3)(4)...實現無限極累加原理解析JS函式
- Sanic add_websocket_route() 方法/函式Web函式
- Python add()函式是如何使用呢?Python函式
- 用Map+函式式介面來實現策略模式函式模式
- VS在 x64 編譯環境下使用匯編函式編譯函式
- 用雲函式快速實現圖片爬蟲函式爬蟲
- 用函式正規化實現戰略模式函式模式
- 用listagg函式分組實現列轉行函式
- MySQL分析函式實現MySql函式
- MySQL排名函式實現MySql函式
- fcntl函式實現dup函式
- 用函式實現模組化程式設計二函式程式設計
- 用函式實現模組化程式設計三函式程式設計
- 用函式實現模組化程式設計一函式程式設計
- 用 splice函式分別實現 push、pop、shift、unshi函式
- JavaScript的迭代函式與迭代函式的實現JavaScript函式
- 實用函式式 Java (PFJ)簡介函式Java
- 去抖函式的實現函式
- bind 函式的實現原理函式
- 巧妙地實現 debugOnly 函式Go函式
- js實現函式過載JS函式
- async 函式的實現原理函式
- Golang實現PHP常用函式GolangPHP函式
- Go實現PHP常用函式GoPHP函式
- Java ArrayList.add 的實現Java
- 用函式實現模組化程式設計習題函式程式設計
- 實現call函式,手寫Function.prototype.call函式函式Function
- 利用“匯出函式和DCOM介面”執行穿透指令、實現橫向滲透函式穿透
- 匯入jar包,main函式JARAI函式
- 科裡化函式實現以及應用場景講解函式
- Excel VBA小程式 -使 用VBA實現VLOOKUP函式查詢?Excel函式
- SQLServer用函式實現對字串按照特定字元進行拆分SQLServer函式字串字元
- Vue元件實現函式防抖Vue元件函式
- Vue實現函式防抖元件Vue函式元件