在我们开始学习Linux汇编之前,需要简单的了解一下计算机的体系结构。我们不需要特别深入的了解,理解了一些基本概念对与我们理解程序会很有帮助。现在计算机的结构体系都是采用冯诺依曼体系结构的基础上发展过来的。而冯诺依曼的体系有两个主要组成部分:CPU和内存。而我们的汇编语言和这两个部分十分密切。
1.1 内存结构
内存的结构就像一排连续的房子,或者是一种矩阵。每个空间的大小是固定的,且每一个存储单元都有自己的地址或者编号。房子的地址是门牌号,而内存的每个单元都有自己的地址。
计算机的内存有数以万计的bit组成,每个bit可以保存0或1的值。但一个bit太小,单独使用用处不大,所以把8bit作为一个单位,叫做字节byte。
1.2 CPU结构
CPU一次从内存中读取一条指令并执行,前面CPU执行指令的的过程叫做读取–执行周期或者叫做指令周期。而CPU基本包涵下面的部分:
- 程序计数器
- 指令解码器
- 数据总线
- 通用寄存器
- 算术逻辑单元
程序计数器保存即将执行的下一条指令的内存地址,CPU先查看程序计数器,获取指定地址的数字,并把这个数据交由指令解码器来解释那个数字所代表的指令。之后,计算机使用数据总线取得存储在内存单元的用于计算的数据。(顺便提一下,数据总线是CPU和内存之间的物理连线)
当然,作为CPU中的特殊高速存储单元——寄存器有两种:通用寄存器和专用寄存器。
通用寄存器是进行主要计算的地方,比如加减乘除和比较等运算。但CPU中的通用寄存器很少,所以只有当处理是数据才会进入寄存器中,不用时都存储在主内存中。
专用寄存器不好说明,当遇到具体情况在说明。
1.3 寻址方式
计算机处理器对数据有多种不同的访问方式,称为寻址方式。
- 立即寻址方式 指令本身就包含了访问的数据。比方说,我们要把寄存器初始化为0,那么可以使用立即寻址方式,把0赋值给寄存器,而不是告诉计算机一个值为0的地址
- 寄存器寻址 访问对象是寄存器,不是内存里的地址,这个好理解。
- 直接寻址方式 指令中包含要访问的内存地址。
- 变址寻址方式 指令中包含一个访问地址之外,还要指定一个变址寄存器,其中包含该地址的偏移量。比如内存地址是2013, 变址寄存器的值是2, 那么实际访问的地址是2013 + 2 = 2015. 而且还可以指定变址的比例因子,比如我们想要一字(4字节)访问,那么比例因子就是4。
- 间接寻址方式 指令中有一个寄存器,这个寄存器存储的是一个地址,这个地址只想我们需要的数据,这个地址被称为指针。
- 基址寻址方式 这个方式和间接寻址类似,当加上一个偏移量,将寄存器的值加上这个值,再寻址。