进入汇编第二章的学习,我们逐渐地开始认识这些位于计算机操作底部的硬件和数据。
(一) 通用寄存器
通过对第一章的学习,我们了解到了寄存器的作用是进行信息存储。而对一个汇编程序员来说,CPU中的主要部件,寄存器是CPU中程序员可以用指令读写的部件。
在8086CPU中,通用寄存器为AX,BX,CX,DX,它们通常用来存放一般性的数据,所以被称为通用寄存器。8086中的所有寄存器都是16位的,它们每个又都可以被分为两个寄存器,以AX举例,AX可以被分为AH和AL,AH用于存放高8位,AL用于存放低8位。
(二) 字数据在寄存器中的存放
我们知道,任何数据在寄存器中都是以二进制方式储存的,但为了描述和解决不同的问题,又会常常将它们用其他的禁止来表示。以8086CPU举例,它可以一次性地处理以下两种尺寸的数据:字 与字节。
字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。
字:记为word,一个字由两个字节组成,这两个字节分别被称为这个字节的高位和低位字节,可以存在16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位和低8位寄存器中。
(三) CPU给出物理地址的方法
8086CPU中有20位地址总线,可以传送20位地址,它的寻址能力可以达到1MB,但是8086CPU为16位结构,寄存器也都是16位的,这意味着它在内部进行处理和传输时只能以16位的形式,因此8086CPU中采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址,一个为段地址,一个为偏移地址。实际的物理地址=段地址*16+偏移地址。
必须注意到这种表示方法意味着同一个地址存在着多种不同的表达方式。
(四) 段的概念与段寄存器
段地址中的“段”并不意味着内存被划分为了一个一个的段,这个段的概念是由我们自己人为的规定的,比方说,我们可以取10000H~100FFH为一个段,也可以把它分为4个段,5个段,段的概念是为了我们方便操作而存在的,根据你不同的使用可以划分不同的段。不过我们需要注意到,因为段地址*16必为16倍数,所以段的起始地址也一定是16的倍数;因为偏移地址为16位,所以一个段的最大长度位64KB。
在前面我们了解到实际的物理地址是由两个地址合成而来的,而其中的段地址就是存放在段寄存器中的。8086CPU有4个段寄存器:CS,DS,SS,ES。当CPU要访问内存是就由这四个段寄存器提供内存单元的段地址,它们分别在不同的情况下工作。在这里只介绍CS。
CS和IP两个寄存器指示CPU当前要读取指令的地址,CS为代码段寄存器,IP为指令指针寄存器。在8086PC机中,计算机每运行一条指令完毕,下一条指令的地址就由CS与IP提供,即16*CS中的数据+IP中的数据为下一条指令的实际地址。注意,每次一条指令运行完毕,IP自己增加所读指令的长度,从而指向下一条指令.
(五) 简单的汇编指令
mov a,b 代表将b中的数据送入a a与b可以是寄存器,数据,内存单元,段寄存器
add a,b 代表将b中的数据与a中的数据相加并存于a中 a只能为寄存器和内存单元,b可为数据,寄存器,内存单元
sub a,b 代表将a中的数据减去b中的数据并存于a中 适用范围与add相同
jmp 段地址:偏移地址 代表用指令中给出的段地址修改CS,偏移地址修改IP
jmp 寄存器 代表用指令中给出的寄存器中的值修改IP