一、计算机基本组成
首先就是熟悉的冯·诺依曼的计算机基本结构,运算器,控制器,存储器,输入输出设备,五大部件组成。运算器和控制器合称为中央控制器(CPU)。
- CPU,主要有算术和逻辑运算单元ALU,地址发生和控制单元,指令译码单元数据寄存器单元,总线驱动单元,时序控制单元等组成。
- 存储器,就是分为内存外存,在此不多赘述。
- 输入输出设备,非常常见,典型的显示屏,键盘等。
- 总线及接口,分为内部总线和外部总线。内部总线指CPU中连接各部件的线。外部总线又称为系统总线,是连接计算机主板上各种芯片及各个接口的线,分为地址总线,数据总线,控制总线。
注:外部设备与计算机主机之间必须有一个中间介质作为缓冲部件,该部件称为接口,串行接口数据一位一位传送,只需要一根数据线。并行接口,同时并行传输多位数据。
二、微型计算机系统
微处理器
分为执行部件EU和总线接口部件BIU两部分。
- 执行部件EU:包含运算器的算术逻辑运算单元ALU、通用寄存器组、标志寄存器FLAGS、EC单元控制系统等。
- 总线接口部件BIU:包含段寄存器组(CS、DS、ES、SS),指令指针寄存器IP,指令队列单元,地址加法器、总线控制系统等。
三、8086寄存器
1. 数据寄存器
包括AX、BX、CX、DX四个16位的通用寄存器,用于存放计算过程中的所用的操作数。
- AX 通用寄存器 :主要作为累加器使用
- BX 通用寄存器 :还用作基址寄存器
- CX 通用寄存器 :还用作计数器
- DX 通用寄存器 :在做双精度运算时与AX一起存放一个双字操作数(32位2进制),DX存放高位,AX存放低位。
数据寄存器每一个寄存器又可以分为2个8位的寄存器,分别为AH、AL、BH、BL、(其他的以此类推)H代表高位,L代表低位。
例如:DX、AX存放23456789H。表示为DX=(2345H),AX=(6789H)。
AX存放1234H,则AH=(12H),AL=(34H)。
2.地址寄存器
地址寄存器包括指针和变址寄存器SI、DI、 SP、BP 四个16位寄存器。顾名思义,它们可用来存放存储器操作数的偏移地址(至于改概念随后会说到)。另外,它们也可以作为通用寄存器用。
- SI源变址寄存器,可用于存放源缓冲区的偏移地址。
- DI目的变址寄存器,可用于存放目的缓冲区的偏移地址。
- SP堆栈指针寄存器,用于指出堆栈区
栈顶
的偏移地址。 - BP基址指针寄存器,用于指出堆栈区
某个单元
的偏移地址。
3.段寄存器
8086 CPU有4个16位的段寄存器,分别是CS、DS、ES、 SS。
- CS 代码段寄存器,用于指出存放程序的代码段的段地址。
- DS 数据段寄存器,用于指出存放数据的数据段的段地址。
- ES 附加段寄存器,用于指出存放附加数据的附加段的段地址。
- SS 堆栈段寄存器,用于指出堆栈区的堆栈段的段地址。
4.控制寄存器
控制寄存器包括IP和FLAGS ( 又称为PSW程序状态字)两个16位寄存器。用于控制程序的执行。
IP指令指针寄存器,用来存放代码段
中的偏移地址,指出当前正在执行指令的下一条指令。
FLACS标志寄存器的某位代表CPU的1个标志。有6个条件标志和3个控制标志。条件标志
如下:
- CF 进位标志,当指令执行结果的最高位向前有进位时,CF=1,否则CF=0。
- SF 符号标志,当指令执行结果的最高位(符号位)为负时,SF=1, 否则SF=0。
- ZF 零标志,当指令执行结果为0时,ZF=1,结果不为0时,ZF =0。
- OF 溢出标志,当指令执行结果有溢出( 超出了数的表示范围)时,OF=1, 否则OF =0。
- AF 辅助进位标志,当指令执行结果的第3位(半字节)向前有进位时,AF=1,否则AF=0。
- PF 奇偶标志, 当指令执行结果中1的个数为偶数个时, PF=1,否则PF =0。
控制标志
如下:
- DF 方向标志,执行串处理指令时,若设置DF=0,存储单元的地址寄存器的值自动增加,若设置DF=1,存储单元的地址寄存器的值自动减小。
- IF 中断标志,设置IF=1,允许CPU响应可屏蔽中断,IF=0则不响应。
- TF 陷阱标志,在DEBUCG调试时,TF=1,采用单步执行方式,即进入陷阱; TF=0,正常执行程序。
四、内存储器
1.物理地址与逻辑地址
CPU对内存的访问通过地址总线进行,地址总线的每一个二进制组态对应一个存储单元,可作为该存储单元的的地址。比如,系统有10根地址线A9-A0,则有0~1023号不同组合,可以表示1024个存储单元。寻址空间达到1Kb,可以看出,若地址线总数为n,则地址空间的大小单元为2^n。在汇编语言中地址用16进制表示。
物理地址
:这是内存单元的真实地址。存储单元的物理地址唯一。Intel 8086有20根地址线,存储空间达1MB,物理地址范围为00000H~FFFFFH。逻辑地址
:是用户编程时使用的地址,分为段地址和偏移地址两部分。在8086汇编语言中,把内存地址空间划分为若干逻辑段,每段由一些存储单元构成。用段地址指出是哪- -段,偏移地址标明是该段中的哪个单元。段地址和偏移地址都是16位二进制数。由于段地址和偏移地址有多种组合,则有可能多种逻辑地址组合对应到同一个物理单元上,因此存储单元的逻辑地址不是唯一
的。
逻辑地址的形式 :段地址:偏移地址
2.存储单元
在汇编语言中,把存储单元分为字节单元、字单元、双字单元等,称为存储单元的属性。其中字节单元可存储8位二进制数,用2个相邻的字节单元作为字单元存储16位二进制数,用4个字节单元代表双字单元存储32位二进制数,以此类推即可存放多字节数据。
存储单元中的数据称为存储单元内容,存储单元还有地址,用括号将地址括起来以代表单元的内容。
(3075AH) = 12H,表示3075AH单元中的内容是12H。
(37692H) =5678H,表示37692H单元和37693H单元一起存放5678H,该单元是字单元。字单元在存储的时候,高字节放在高地址单元,低字节放在低地址单元。即56H放在37693H单元,78H放在37692H单元。
3.存储器分段
8086CPU提供的地址线为20根,可我们知道,8086CPU的地址寄存器只有16位,达不到20位的地址范围。针对这种情况,8086系统采用实模式工作方式下对存储器划分逻辑段的办法解决16位字长机器提供20位地址的问题。
将存储器划分为若干逻辑段,每段最大64K字节单元。逻辑段的大小可变,每段最少16个字节单元,也可到最大65536个字节单元。这样段内单元的地址可用16位二进制数表示,称为偏移地址。每个段的偏移地址可从0000~FFFFH。段地址也是16位的,用于标识是哪一-个段。段地址和偏移地址构成逻辑地址。
那么这就很好理解了,举个例子,有一堆箱子,箱子里也有一堆物品,总体上物品数量极其庞大,那么如何确定并找到任意一个箱子里的任意物品呢?先对箱子进行划分,标号。再对箱子里的物品重新标号。那么我们知道了箱子的号码和箱子里物品的号码,可以直接找到这个物品。段地址就类似箱子的号码,偏移地址就类似于箱子里物品的号码。
同时规定,存储器分段时,各段的起始地址必须是小段的首地址,即逻辑段必须从任一个小段的首单元开始,而不能从其他的字节单元开始。
在将逻辑地址转换为物理地址时,物理地址=段地址x10H+偏移地址,相当于把16位的段地址又恢复为20位,再和偏移地址相加就得到了20位的物理地址。
4.段的类型
我们知道,数据和程序都是以二进制的形式保存在存储器中的,如果不加以区分,将无法获知读取的数据是数值还是指令。所以需要把逻辑段分为几个类型。
- 代码段 :用于存放指令,段地址存放在段寄存器 CS。
- 数据段 :用于存放数据, 段地址存放在段寄存器 DS。
- 附加段 :用于辅助存放数据,段地址存放在段寄存器 ES。
- 堆栈段 :是重要的数据结构,可用来保存数据、地址和系统参数,段地址存放在段寄存器 SS。
Masm2015下载戳这里
提取码 :9aiq
参考书籍:《汇编语言》第二版 郑晓薇