平台
工具
文件
#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