平台
工具
文件
#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;
}
; 聲明給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