用汇编实现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 ; 获取第二个参数
    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

猜你喜欢

转载自www.cnblogs.com/megachen/p/9695556.html