x86-64位指令学习
参考文章:
(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位指令学习的更多相关文章
- 64位BASM学习随笔(一)
64位BASM学习随笔(一) Delphi的BASM一直是我最喜爱的内嵌汇编语言,同C/C++的内联汇编相比,它更方便,更具灵活性,由于C/C++的内联汇编仅仅能是或插入式的汇编代码,函数花括号 ...
- win7+64位+Java学习基本软件安装+环境配置+eclipse(IDE)
一.下载安装JDK 1.安装包下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.h ...
- centos(x86 64位系统)使用boost
1. 安装gcc,g++,make等开发环境 yum groupinstall "Development Tools" 2. 安装boost yum install boost b ...
- 64位WINDOWS系统环境下应用软件开发的兼容性问题(CPU 注册表 目录)
应用软件开发的64 位WINDOWS 系统环境兼容性 1. 64 位CPU 硬件 目前的64位CPU分为两类:x64和IA64.x64的全称是x86-64,从名字上也可以看出来它和 x86是兼容的,原 ...
- 32位的Win7系统下安装64位的Sql Sever?
来自:http://zhidao.baidu.com/link?url=nQBoaLgoOyYCUdI7V4WZCMlTW3tKscdkOnLTIvlYtPpwoVhQkSahq44HeofBfzFT ...
- 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境
搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...
- 64位 windows10,安装配置MYSQL8.0.13
MySQL的安装配置过程,一查网上一大堆,但是每个人在安装配置的过程中都会碰到一些问题,因为安装的版本不一样,有些命令可能就不适用了.所以安装之前一定先确认好你的版本号. 下面开始安装MYSQL8.0 ...
- PHP在 win7 64位 旗舰版 报错 Call to undefined function curl_init()
代码在ubuntu下无缝运行OK 转到我的win7 64位 期间 学习机上 报错: Call to undefined function curl_init() 因为用到curl 远程抓取数据. 所以 ...
- [转载]使用32位64位交叉编码混淆来打败静态和动态分析工具 - wildsator
0×00 摘要 混淆是一种能增加二进制分析和逆向工程难度与成本的常用技术.主流的混淆技术都是着眼于使用与目标CPU相同的机器代码,在相同的处理器模式下,隐藏代码并进行控制.本文中引入了一种新的混淆方法 ...
随机推荐
- Matlab观察者模式
要点: 1.服务端(Subject)维护一个观察者的列表,以便能够向所有的观察者(Observer)推送信息 2.观察者可以获取服务端的状态 3.服务端和观察者可抽象,可以有多个不同实现 Subjec ...
- Tomcat启动找不到项目依赖jar的解决方式
一.背景 最近在写一个MQ框架-gmq,先写的服务端,然后写客户端.感觉服务端和客户端分成两个独立的项目不合适,于是改成了maven父子模块的形式.父项目相当于一个壳,里面包含服务端.客户端两个模块. ...
- VUE基础回顾6
1.ref ref可以直接访问元素,而不需要使用querySelector或者其他dom节点的原生方法. <div ref = "box"></div> 在 ...
- 遍历js对象中的属性
可以使用js自带的for in.也可以使用Ext JS中的方法来遍历js对象中的属性 代码如下: /** 遍历对象 */ var person = {name:'张泰松',age:28}; //js方 ...
- pychrom注册码
http://angame.top/wx/web/zhucema/ YZVR7WDLV8-eyJsaWNlbnNlSWQiOiJZWlZSN1dETFY4IiwibGljZW5zZWVOYW1lIjo ...
- Radmin入侵
Radmin (Remote Administrator)是一款屡获殊荣的远程控制软件,它将远程控制.外包服务组件.以及网络监控结合到一个系统里,提供目前为止最快速.强健而安全的工具包 生成被控端 点 ...
- idea忽略并隐藏.idea文件夹.iml文件不提交到svn
File-->setting-->Editor-->File Types 选中.boringignore,添加*.iml;.idea;即可
- Hive架构分析
一.Hive三种设计模式 1.默认配置[使用Netty存储元数据] 2.mysql[使用mysql存储元数据] 3.配置Thrift[使用mysql存储元数据] 二.执行步骤 三.scala访问Hiv ...
- Python学习日记(三十) Socket模块使用
Socket(套接字) 套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网 ...
- Kali下的内网劫持(四)
在前面我都演示的是在Kali下用命令行的形式将在目标主机上操作的用户的信息捕获的过程,那么接下来我将演示在Kali中用图形界面的ettercap对目标主机的用户进行会话劫持: 首先启动图形界面的ett ...