参考文章:

(1)x86-64指令系统过程调用学习笔记 https://blog.csdn.net/weixin_44735312/article/details/89818907

创建文本sum.c并编写如下程序:

#include <stdio.h>

int sum(int x,int y){
    int t = x +y;
    return t;
}  

通过如下命令生成sum.o文件。

gcc -O2 -c sum.c

通过如下命令查看在x86-64平台上的机器指令:

objdump -d sum.o

最终的机器指令如下:

sum.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <sum>:
   0:	8d 04 37      lea    (%rdi,%rsi,1),%eax
   3:	c3            retq  

lea传输源操作数偏移(而不是值)到目的寄存器。源操作数必须为内存操作数,目的寄存器必须为同一寄存器。

创建fun.c文件,内容如下:

long caller(){
   char a = 1;
   short b = 2;
   int c = 3;
   long d = 4;
   callee(a,&a,b,&b,c,&c,d,&d);
   return a*b + c*d;
}

void callee(char a,char* ap,short b,short* bp,int c,int* cp,long d,long* dp){
   *ap += a;
   *bp += b;
   *cp += c;
   *dp += d;
}

生成的机器码如下:

建立test.c,内容如下:

int add();
int main(){
  int c = add();
  return 0;
}

int add(){
  int z = 1+2;
  return z;
}  

使用如下命令生成汇编,命令如下:

gcc -m32  -S test.c  // -m32表示生成32位的汇编,-S表示只激活预处理和编译,就是指把文件编译成为汇编代码

最终生成的test.s的内容如下:

下面看一下带入参的C程序,新建test2.c,内容如下:

int add(int a,int b);
int main(){
 int a = 5;
 int b = 3;
 int c = add(a,b);
 return 0;
}

int add(int a,int b){
 int z = 3;
 return z;
}

使用如下命令生成汇编,命令如下:

gcc -m32  -S test2.c  // -m32表示生成32位的汇编,-S表示只激活预处理和编译,就是指把文件编译成为汇编代码

最终生成的test2.s的内容如下:

 

最新文章

  1. 微软版的SqlHelper.cs类
  2. 3D图形图像处理软件HOOPS介绍及下载
  3. js jq 获取网页元素宽度
  4. var 和 dynamic在实际项目中的应用
  5. iframe 的基本操作
  6. 5、判断、循环、数组综合练习案例(迷你DVD)
  7. 关于iOS开发中info.plist文件的解读
  8. easyui1.2.6 validate输入框验证在火狐下的一个bug
  9. UNIX网络编程——基本TCP套接字编程
  10. 单片机开发——02工欲善其事必先利其器(Proteus软件安装破解)
  11. C# String 与 StringBuilder
  12. CentOS7 config aliyun yum repository
  13. EasyUI datagrid easyui datagrid +dialog 加载 可直接运行 七
  14. 顺序表[A+B-&gt;A]
  15. CUDA C Programming Guide 在线教程学习笔记 Part 8
  16. Count 1 in Binary
  17. *2.2.4 加入virtual interface
  18. HTTP协议,详解
  19. ipv6被拒的解决方法
  20. scss-变量作用域

热门文章

  1. 【开发笔记】- 转义html特殊字符
  2. mysql配置临时日志(无需重启服务)
  3. VLC架构及流程分析
  4. linux下测试某网址或IP端口能否访问
  5. layui加载显示问题
  6. go调度: 第一部分-OS调度(操作系统调度)
  7. Keystore Problem: Cannot convert COMBINED of type class java.lang.String to class org.jivesoftware.openfire.spi.ConnectionType
  8. influxDB应用及TICK stack
  9. NGINX状态模块的使用
  10. test20190924 老L