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相同的机器代码,在相同的处理器模式下,隐藏代码并进行控制.本文中引入了一种新的混淆方法 ...
随机推荐
- Spring的核心容器
Spring框架的主要功能是通过其核心容器来实现的.Spring提供了2种核心容器:BeanFactory.ApplicationContext. BeanFactory BeanFactory是一个 ...
- linux apache的httpd
学习目标:apache在linux上的应用,通过三种方式在浏览器上访问 LAMP:linux+apache+MYSQL+php wamp:windows+apache+MYSQL+php linux上 ...
- hadoop2.8 ha 集群搭建
简介: 最近在看hadoop的一些知识,下面搭建一个ha (高可用)的hadoop完整分布式集群: hadoop的单机,伪分布式,分布式安装 hadoop2.8 集群 1 (伪分布式搭建 hadoop ...
- maven学习笔记四(聚合和继承)
聚合 现在假如,我创建了3个maven项目, user-core.2.user-log,3.user-service 这个时候,假如我们要打包这些项目,要一个一个来,会很麻烦.那么我们有没有更好的办法 ...
- 今天看了《SOFT SKILLS The Software Developer's Life Manual》有感
从第四篇生产力开始看的,书中提到了专注,待续
- 使用python的jira库操作jira的版本单和问题单链接
操作JIRA的API来实现的. 但感觉比单纯操作API要简单一些. from jira import JIRA from django.conf import settings JIRA_URL = ...
- Kotlin协程第一个示例剖析及Kotlin线程使用技巧
Kotlin协程第一个示例剖析: 上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直 ...
- Kotlin属性引用进阶与构造方法引用
继续还是探讨Kotlin反射相关的知识点,说实话这块不是太好理解,待在实际工作中去对它进行实践慢慢来加深印象. 属性引用进阶: 在Kotlin中的反射其实是跟Java的反射有对应关系的,具体相关的定义 ...
- 【转】libgo
原文:https://blog.csdn.net/libaineu2004/article/details/80554870 ------------------------------------- ...
- MySql数据封装操作类
1.先引用MySQL的DLL文件 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...