汇编语言与 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 2022-11-05 15:36  LambdaQ  阅读(377)  评论(0)    收藏  举报