博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用汇编实现add函数
阅读量:5983 次
发布时间:2019-06-20

本文共 854 字,大约阅读时间需要 2 分钟。

平台

  • macOS

工具

  • nasm
  • clang

文件

  • main.c
#include 
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 addsection .datasection .textadd:    ; 这两句在所有函数中都是必须的, 功能就是将从父函数的栈切换到子函数的栈    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

转载地址:http://rgrox.baihongyu.com/

你可能感兴趣的文章
Node 错误处理之挖坑系列
查看>>
vue 项目开发 lenovo商城
查看>>
来自crush的中序遍历完全二叉树
查看>>
[LeetCode] Find Bottom Left Tree Value
查看>>
【leetcode】44. Wildcard Matching 通配符匹配
查看>>
【Leetcode】6. ZigZag Conversion
查看>>
[笔记]effective backprop
查看>>
webpack 使用优化(一)
查看>>
分片上传与断点续传解决方案
查看>>
Docker和rkt快别争了,k8s才是容器生态的中心
查看>>
服务器时区问题
查看>>
《JavaScript 闯关记》之变量和数据类型
查看>>
Microsoft Office Communications Server 2007 R2 安装排错一例
查看>>
Powershell 修改Office365和AD账户
查看>>
Zabbix 神器——自动发现
查看>>
RHCE 学习笔记(27) grub 和开机排错
查看>>
java Maxnumber
查看>>
去掉android的屏幕上的title bar
查看>>
黄金分割的金苹果——浅谈apple设计中的黄金分割
查看>>
4.IT-解决方案-4-Cluster-Win2K3
查看>>