zoukankan      html  css  js  c++  java
  • 用汇编实现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
    ", 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
  • 相关阅读:
    数据可视化
    tkinter学习04
    小练习-----银行提款机系统
    python___docx模块
    Django【进阶篇 】
    Django之Cookie/session/防止XSS攻击
    tkinter学习03
    tkinter学习02
    AJAX
    tkinter学习01
  • 原文地址:https://www.cnblogs.com/megachen/p/9695556.html
Copyright © 2011-2022 走看看