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
  • 相关阅读:
    撩课-Python-每天5道面试题-第8天
    声明提前、原型、静态方法的一些所得
    梳理ajax
    两数之和、整数反转、回文数
    node 基础API(fs)
    node 基础API(event)
    node 基础API(Buffer)
    node 基础API(path)
    node 调试技巧
    node process(进程) 几个常用属性
  • 原文地址:https://www.cnblogs.com/megachen/p/9695556.html
Copyright © 2011-2022 走看看