csapp读书笔记004
第三章
程序的机器级表示
计算机执行机器代码,用字节序列编码低级的操作。
本章主要是近距离观察机器代码也就是汇编代码。
首先是为什么需要学习汇编代码呢?主要是理解编译器的优化能力。
32位内存4GB,64位内存最大16EB(2^64字节)
3.1历史观点:
Intel处理器,俗称x86,经历了长期的不断进化的发展过程。
摩尔定律:晶体管数目每两年翻一番
3.2 程序编码

gcc -og是产生符合原始c代码的整体结构的机器代码优化等级。
3.2.1机器级代码

机器代码与原始的c代码差别非常大。一些通常对C语言程序员隐藏的处理器状态都是可见的
PC:下条指令内存地址
整数寄存器文件:
条件码寄存器保存最近执行的算术或逻辑指令的状态信息。
一组向量寄存器:存放一个或多个整数或浮点数值。
机器代码只是将内存看成一个很大的,按字节寻址的数组,

一条机器指令只执行一个非常基本的操作,例如,将存放在寄存器中的两个数字相加,在存储器和寄存器之间传送数据,或者是条件分支转移到新的指令地址。编译器必须产生这些指令序列,从而实现程序结构。
3.2.2 代码示例



gcc-s就是编译,-o就是优化 -og是基本上不优化。
最后的机器代码就是

这是二进制格式的,16进制打开如上图
就是汇编代码一行一行转变的
不同平台产生的汇编代码都完全不一样,反汇编跟原先的代码完全不一样。
反汇编过程

和原先代码不一样了
x86-64,常用的指令以及操作数较少的指令的字节数较少,不常用的字节数较多
生成实际可执行的代码需要链接器


这个打出来就直接执行了,直接代码粘贴进去了
这就是静态链接
3.2.3 关于格式的注解

类似于Java字节码的感觉
带解释的如下

ATT是从前赋值到后
intel是反过来的

asm内嵌汇编语言
用asm的伪指令即可


3.4访问信息


数据传送指令


163/775



push是栈顶减8,pop则+8
算术右移和逻辑右移
算术右移,如果最高位为1,则补1,否则补0,逻辑右移,则不考虑符号位
加载有效地址 &


浙公网安备 33010602011771号