x86-64位指令学习
2024-09-02 02:53:58
参考文章:
(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的内容如下:
最新文章
- 微软版的SqlHelper.cs类
- 3D图形图像处理软件HOOPS介绍及下载
- js jq 获取网页元素宽度
- var 和 dynamic在实际项目中的应用
- iframe 的基本操作
- 5、判断、循环、数组综合练习案例(迷你DVD)
- 关于iOS开发中info.plist文件的解读
- easyui1.2.6 validate输入框验证在火狐下的一个bug
- UNIX网络编程——基本TCP套接字编程
- 单片机开发——02工欲善其事必先利其器(Proteus软件安装破解)
- C# String 与 StringBuilder
- CentOS7 config aliyun yum repository
- EasyUI datagrid easyui datagrid +dialog 加载 可直接运行 七
- 顺序表[A+B->;A]
- CUDA C Programming Guide 在线教程学习笔记 Part 8
- Count 1 in Binary
- *2.2.4 加入virtual interface
- HTTP协议,详解
- ipv6被拒的解决方法
- scss-变量作用域
热门文章
- 【开发笔记】- 转义html特殊字符
- mysql配置临时日志(无需重启服务)
- VLC架构及流程分析
- linux下测试某网址或IP端口能否访问
- layui加载显示问题
- go调度: 第一部分-OS调度(操作系统调度)
- Keystore Problem: Cannot convert COMBINED of type class java.lang.String to class org.jivesoftware.openfire.spi.ConnectionType
- influxDB应用及TICK stack
- NGINX状态模块的使用
- test20190924 老L