编译
gcc -Og -o p pl. c p2 .c
-Og告诉编译器使用会生成符合原始C代码整体结构的机 器代码的优化等级。-O1 -O2
C预处理器 插入所有用#include命令指定的文件,并扩展所有用#define声明指定的宏。
编译器 产生两个源文件的汇编代码,名字分别为pl.s和p2.s。
汇编器会将汇编代码转化成二进制目标代码文件pl.。和p2.o。没有填入全局值的地址
链接器将两个目标代码文件与实现库函数(例如printf)的代码合并,并产生最终的可执行代码文件P(由命令行指示符-o p指定的)
机器级代码
指令集架构 ISA 定义机器级程序的格式和行为
机器级程序使用的内存地址是虚拟地址
gcc -Og -S instore. c
long mult2(long, long);
void multstore(long x, long y, long *dest) {
long t = mult2(x, y);
*dest = t;
}
gcc运行编译器 产生一个汇编文件 mstore.s
gcc -Og -c mstore. c
gcc会编译并汇编该代码 产生mstroe.o 二进制格式
反汇编器
objdump -d instore. o
ATT格式 gcc -Og -S mstore. c
Intel格式 gcc -Og -S -masm=intel mstore. c
指令
数据
字 16位
32位数被看成是“长字(long word)
寄存器
16个存储64位值的通用目的寄存器
生成1字节和2字节数字的指令会保持剩下的字节不变;生成4字节数字的指令会把高位4个字节置为0。
寻址
立即数 ATT格式 $ 后跟一C语言表示法表示整数
寄存器 ra表示任意寄存器a 引用R