该主题默认在类unix操作系统中进行讨论
gcc编译器可通过不同的参数,生成不同阶段的编译文件,比如,我们想生成可执行文件,就用gcc -o;要生成目标代码.o,就用gcc -c;要生成汇编代码.s,就用gcc -S,
程序译的顺编序是,编译器先根据.c源文件产生.s汇编文件,然后汇编器会把.s转换成目标文件.o,最后由链接器将.o文件与unix库函数合并,产生可执行文件。
当我们得到.o时,还可以用objdump -d *.o,对目标文件进行反汇编,屏幕会打印出十六进制与汇编文件的对应解释。
以上说的都是操作方法,接下来的几章我们将浅析汇编语言的内幕。
首先来看汇编语言的基础知识
一:数据格式
由于计算机经历从16位机扩展到32位机的过程,intel沿用的以前的标准,即将16位(即2字节)定义为“字”,32位定义为“双字”。而8位仍成为“字节”,用符号表示如下:
字:w 16位
双字:l 32位
字节:b 8位
单精度:s 8位
双精度:l 32位
汇编语言在操作上沿用了这样的命名方式,比如数据传送命令movl,我们就能看出这是对32位4字节的操作
二:寄存器
汇编语言简单说就是游走于寄存器、存储器(内存)之间进行运算和操作的语言,因此寄存器的概念是至关重要的。
下面是整数寄存器示意图:
31 15 8 7 0
%eax %ax |
|
||
%ecx %cx |
|
||
%edx %dx |
|