参考文章:

(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的内容如下:

 

x86-64位指令学习的更多相关文章

  1. 64位BASM学习随笔(一)

     64位BASM学习随笔(一) Delphi的BASM一直是我最喜爱的内嵌汇编语言,同C/C++的内联汇编相比,它更方便,更具灵活性,由于C/C++的内联汇编仅仅能是或插入式的汇编代码,函数花括号 ...

  2. win7+64位+Java学习基本软件安装+环境配置+eclipse(IDE)

    一.下载安装JDK 1.安装包下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.h ...

  3. centos(x86 64位系统)使用boost

    1. 安装gcc,g++,make等开发环境 yum groupinstall "Development Tools" 2. 安装boost yum install boost b ...

  4. 64位WINDOWS系统环境下应用软件开发的兼容性问题(CPU 注册表 目录)

    应用软件开发的64 位WINDOWS 系统环境兼容性 1. 64 位CPU 硬件 目前的64位CPU分为两类:x64和IA64.x64的全称是x86-64,从名字上也可以看出来它和 x86是兼容的,原 ...

  5. 32位的Win7系统下安装64位的Sql Sever?

    来自:http://zhidao.baidu.com/link?url=nQBoaLgoOyYCUdI7V4WZCMlTW3tKscdkOnLTIvlYtPpwoVhQkSahq44HeofBfzFT ...

  6. 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境

    搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...

  7. 64位 windows10,安装配置MYSQL8.0.13

    MySQL的安装配置过程,一查网上一大堆,但是每个人在安装配置的过程中都会碰到一些问题,因为安装的版本不一样,有些命令可能就不适用了.所以安装之前一定先确认好你的版本号. 下面开始安装MYSQL8.0 ...

  8. PHP在 win7 64位 旗舰版 报错 Call to undefined function curl_init()

    代码在ubuntu下无缝运行OK 转到我的win7 64位 期间 学习机上 报错: Call to undefined function curl_init() 因为用到curl 远程抓取数据. 所以 ...

  9. [转载]使用32位64位交叉编码混淆来打败静态和动态分析工具 - wildsator

    0×00 摘要 混淆是一种能增加二进制分析和逆向工程难度与成本的常用技术.主流的混淆技术都是着眼于使用与目标CPU相同的机器代码,在相同的处理器模式下,隐藏代码并进行控制.本文中引入了一种新的混淆方法 ...

随机推荐

  1. 图解HTTP(二)

    第四章 返回结果的HTTP状体码 1.状态码告知从服务器返回的结果   类别 原因短语 1XX Infomational信息性状态码 接收的请求正在处理中 2XX Success成功状态码 请求正常处 ...

  2. python day 18: thinking in UML与FTP作业重写

    目录 python day 18 1. thinking in UML读书小感 2. FTP作业重写 2.1 软件目录结构 2.2 FTPClient端脚本 2.3 FTPServer端脚本 pyth ...

  3. Java 之 HTTP 协议

    HTTP 协议 一.基础 1.概念 HTTP:Hyper  Text Transfer Protocol 超文本传输协议. 传输协议:定义了客户端和服务器端通信时,发送数据的格式. 2.特点 (1)基 ...

  4. IDEA下创建Spring项目

    IDEA下创建Java SE Spring项目示例 1.创建项目 第4步:是否自动创建空的Spring容器配置文件,默认文件名是spring-config.xml.勾不勾选都行,如果没勾选,后面要自己 ...

  5. JavaScript获得URL地址栏参数防乱码

    JavaScript获得URL地址栏参数防乱码 JavaScript中经常需要解析地址栏中拼接的参数.下面的代码基本是固定的代码,这里摘录下备用. //获得地址栏参数值 function getUrl ...

  6. python smtp登陆邮箱失败

    >>> server.connect('smtp.163.com') (220, b'163.com Anti-spam GT for Coremail System (163com ...

  7. Yii2安装任务调度扩展

    一.安装扩展 在安装之前添加仓库到composer.json文件中 "repositories": [{"type": "vcs", &qu ...

  8. VMware15.5版本安装CentOS7

    VMware15.5版本安装CentOS7 一.在VMware15.5中新建虚拟机 1.打开VMware,在首页面选择创建新的虚拟机. 2.新建虚拟机向导,选择典型配置.3.选择稍后安装操作系统.4. ...

  9. 使用Arduino连接HC-SR04超声波距离传感器的方法

    距离传感器是机器人项目最有用的传感器之一. HC-SR04是一种便宜的超声波距离传感器,可以帮助您的机器人在房间周围导航.通过一些努力和一个额外的组件,它也可以用作测量设备.在这篇文章中,您将学习到通 ...

  10. 关于缩短cin时间的方法

    std::ios::sync_with_stdio(false);