在计算机组成原理中学到过,每个机器码对应着一组控制信号,汇编代码则是机器代码的文本表示。
gcc -Og -c hello.c # 表示优化等级为最低,贴近原始汇编
-O (同-O1)
-O0 (不进行优化,如果未指定优化级别,则为默认值)
-O1 (最小化优化)
-O2 (优化更多)
-O3 (优化更多)
-Ofast (非常积极地进行优化以达到标准的要求)
-Og (优化调试体验-Og支持不影响调试的优化 )
-Os(优化大小。-Os使所有-O2的优化,通常不会增加代码的大小也进行设计,以减少代码量进一步优化。 -Os禁用以下优化标志:-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version)
对于机器级编程来说,其中两种抽象尤为重要。
一个是机器级程序的格式和行为,定义为指令体系结构(Instruction Set Architecture,ISA ),它定义了处理器状态,指令的格式以及每条指令对状态的影响。大多数ISA,包括IA32和x86-64,将程序的行为描述成好像每条指令时顺序执行的。一条指令执行结束后,下一条指令开始执行。处理器的硬件远远比描述的精细复杂,它们能够并发的地执行许多指令,但是可以采取措施保证整体行为与ISA指定的顺序执行行为一致。
第二种抽象是,机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。
在整个编译过程中,编译器会主要将C语言提供的相对抽象的执行模型表示的程序转化为处理器执行的非常基本的命令。汇编代码非常接近于机器代码。与机器码的二进制格式相比,汇编代码的一个主要特点是,它用可读性更好的文本格式来表示。
能够理解汇编代码以及它与原始C代码的联系,是理解计算机系统如何执行程序关键的一步。
二三章还是没啥意思,以前都学过了,最近在看程序员的自我修养,真是一本好书,解决了很多我对底层的疑问,一定要多读几遍。