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,逻辑右移,则不考虑符号位

加载有效地址 &

 

posted @ 2021-01-26 20:15  chyblogs  阅读(173)  评论(0)    收藏  举报