概述
参考文章:
(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的内容如下:
转载于:https://www.cnblogs.com/mazhimazhi/p/11290793.html
最后
以上就是俊逸毛衣为你收集整理的x86-64位指令学习的全部内容,希望文章能够帮你解决x86-64位指令学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复