现在对于程序员,可能很少要求能够写汇编代码。但是能看懂汇编代码,在一些优化,调试场合下还是很有用的。能够更好的理解C语言对于机器语言的抽象。
在这篇文章中,主要摘录一些要点:
1. 机器代码为字节序列编码的低级操作。
2. 汇编代码是机器代码的文本表示。
3. Intel 32位的指令集(机器码)称为IA32(Intel Architecture 32-bit)。
4. IA32相关的寄存器:
PC(程序计数器)-- %eip : 要执行下一条指令的存储器地址。
8个整数(双字)寄存器文件:
%eax, %ecx, %edx, %ebx, %esi,. %edi, %esp, %ebp ---32位
%ax, %cx, %dx, %bx, %si, %di, %sp, %bp --- 16位
%ah, %al, %ch, %cl, %dh, %dl, %bh, %bl --- 8位
条件吗寄存器。
浮点寄存器。
5. C语言中do {} while, while for 的汇编实现(GCC)都是通过把while 和 for 转换成do {} while。
6. 对于C言语的程序优化可以使用条件传送指令来提高条件分支的执行:
数据的条件转移--条件数据传送:把所有分支的计算结果都执行,然后根据分支判定返回相应的结果。(使CPU的流水线填充的更满)
控制的条件转移--条件控制转移:预测可能执行的分支,提前执行。但是预测失败,会有惩罚。(丢弃之前运行的分支工作)
GCC更倾向于条件控制转移。
7. C语言中swich语句转化为汇编语言时,有时会使用跳转表。跳转表是一个数组,里面存放着可能执行的代码段地址。case的条件比较多,
case值之间的跨度较小,编译器就会选择使用跳转表。