汇编语言与 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
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 要查看目标代码文件的内容,反汇编器只是基于机器代码文件中的字节序列来确定汇编代码,它不需要访问程序的源代码或汇编代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧