汇编语言与 GCC 编译器

系统架构

英特尔32位架构(Intel Architecture, 32-bit,缩写为IA-32),常被称为i386、x86-32或是x86,由英特尔公司推出的复杂指令集(CISC)架构,至今英特尔最受欢迎的处理器仍然采用此架构。它是x86架构的32位延伸版本,1985年首次应用在Intel 80386芯片中用来取代之前的x86 16位架构(x86-16),包括8086、80186与80286芯片。 IA-32 中word(字)表示16位数据类型,32位称为双字数据类型,64位称为四字。

汇编

AT&T 汇编

寄存器介绍 %eax(32) %ax(16) %ah(8) %al(8) 同 %ebx %ecx %edx %esi %edi

所有的指针类型都存储为4字节的双字

  • char 1 字节 b
  • short 2 字 w
  • int 4 双字(32-bit)
  • char* 4 双字
  • float 单精度 4 双字 s
  • double 双精度 8 四字 l

AT&T 汇编中使用小写字母,赋值方向从左向右。寄存器需要加前缀 % 立即数前要加前缀 $ 大多数 GCC 生成的汇编代码指令都有一个字符后缀,表明操作数的大小。

AT&T cmd 源操作数 目的操作数

AT&T 语法将操作数的大小表示在指令的后缀中 (b, w, l)

decw (%eax)

movb (传送字节)

movw (传送字)

movl (传送双字)

INTEL 汇编

Intel cmd 目的操作数 源操作数

Intel 语法将操作数的大小表示在操作数的前缀中(BYTE PTR,WORD PTR,DWORD PTR)

Intel DEC WORD PTR [EBX]

GCC

GCC 版本

GCC从4.7.0版本 2012年开始支持c++11,现在最新版本为10.2
从15年开始每年都会增长一个版本号,到20年已经到10.X.

GCC 6.1开始支持c++14

img

img

img

GCC 编译汇编

int accum = 0;
int sum(int x,int y)
{
  int t = x+y;
  accum += t;
  return t;
}
gcc -O1 -S code.c
// 所有以   .开头的行都是指导汇编器和链接器的命令。
 .section    __TEXT,__text,regular,pure_instructions
       .macosx_version_min 10, 11
       .globl  _sum
       .align  4, 0x90
   _sum:                                   ## @sum
       .cfi_startproc
   ## BB#0:
       pushq   %rbp
   Ltmp0:
      .cfi_def_cfa_offset 16
  Ltmp1:
      .cfi_offset %rbp, -16
      movq    %rsp, %rbp

GCC 编译反汇编

gcc -O1 -c code.c 编译该文件并形成 .o 的目标文件
objdump -d code.o 要查看目标代码文件的内容,反汇编器只是基于机器代码文件中的字节序列来确定汇编代码,它不需要访问程序的源代码或汇编代码。

posted on   LambdaQ  阅读(343)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示