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

 

 

 

 

 

转载于:https://www.cnblogs.com/mazhimazhi/p/11290793.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值