您的位置:首页 > 理论基础

深入理解计算机系统-第3章程序的机器表示(一)

2014-10-21 00:12 639 查看
现在对于程序员,可能很少要求能够写汇编代码。但是能看懂汇编代码,在一些优化,调试场合下还是很有用的。能够更好的理解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值之间的跨度较小,编译器就会选择使用跳转表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息