0. 前言
本门课程主要内容(汇编语言、计算机接口)
- 汇编语言部分:
8088/8086CPU内部结构、内存管理机制、指令系统,伪指令、程序结构、DOS系统功能调用、编程训练。
重点:寄存器名称及应用、内存分段机制、程序运行机制、编程训练。
难点:利用汇编语言编程时的诸多限制,需记忆的内容也较多。- 计算机接口技术部分:
8088/8086CPU外部引脚特性、总线时序、常用接口芯片工作方式(8259、8253、8255、8250、8237等)、实验(用汇编语言编程驱动接口芯片)。
重点:常用接口芯片的工作方式,利用汇编语言编程驱动芯片。
难点:接口芯片工作过程中的信号时序。
为什么要学习这门课?
汇编语言是一门低级语言,其指令与机器指令几乎一一对应,能够从微观角度展示程序的执行以及子程序调用的实现过程,便于学生深入了解计算机系统,为后继学习计算机组成原理、操作系统等课程准备先导知识。
通过学习计算机接口技术,能够让学生了解计算机与外设进行数据传输的过程,帮助学生建立起微型计算机体系结构的基本概念。
编程环境(DOSBox,MASM,接口实验箱)
1.数字系统
数字系统定义了如何用独特的符号来表示一个数字。在不同的系统中,数字有不同的表示方法。
例如:1打,6对,12个,表示同一种数量。
数字系统可分为两类:
位置化系统和非位置化系统。
1.1 位置化系统(进位计数)
在位置化系统中,有一组固定的数字(数字的个数称为基数)和统一的规则,在一个数中,数字在不同的位置所代表的数值是不同的(该值等于数字本身乘以与它所在数位有关的常数,这个常数称为位权,简称权)。
常见位置化系统有:二进制系统、八进制系统、十进制系统、十六进制系统。
在我们熟悉的十进制数中,可以使用10个不同的数字:0,1,2,3,4,5,6,7,8,9。即:十进制的基数就是10。
例如:十进制数:185
其中1代表100,即1×100,百位的位权为100, (102)
其中8代表80,即8×10,十位的位权为10,(101)
其中5代表5,即5×1,个位的位权为1,(100)
185=1×102+8×101+5×100
总结:一个数的数值等于它的各位数码乘以相应位权的总和.
十进制(Decimal)
例如:十进制数678.5,可用678.5D 或 (678.5)10 表示。 展开形式:678.5D=6 × \times × 102+7 × \times × 101+8 × \times × 100+5 × \times × 10-1
二进制(Binary)
八进制(Octal)
十六进制(Hexadecimal)
二进制数、八进制数、十六进制数转换成十进制数
转换规则:任何进制数转换成十进制数时,只要将该进制数的每位数字乘以其对应的位权所得乘积相加,即得到与该进制数相对应的十进制数。
结论:用不同进制所表示的同一个数,虽然表现形式不同,但其数学意义是完全相同的
降幂法和乘/除法
1.2 非位置化数字系统
仍然使用有限的数字符号,每个符号有一个值,该值与其所占用的位置通常没有关系。也可以说是无权的数字系统。
例如:罗马数字是非位置化数字系统。
2. 数据的表示方法与存储
2.1 数据的单位
计算机中与数据存储有关的几个单位
- 比特 (bit):一个二进制位
- 字节 (Byte):8个二进制位为一个字节,存储容量以字节为单位计算
- 字 (word):计算机进行数据处理的基本单位
- 字长:每个字所包含的位数
- 计算机中的数量单位
1K= 210 =1024
1M= 1K·K =210×210 =220 =1048576
1G= 1K·1M =230 =1073741824
1T= 1K·1G =240 =1099511627776
2.2 数值数据
数值数据存储到计算机中,在转换成二进制形式的同时,还需解决如下问题:
-
无符号整数
存储过程:
第一步:将其转换成二进制数;
第二步:若数位不足,左侧补0。
-
带符号整数
机器数:在计算机中,把一个数连同其符号在内进行数值化表示的形式就称为机器数。
在机器数中,一般用最高有效位来表示该数的正负:0表示正号,1表示负号
常用的机器数有:原码、反码和补码
机器数的用途:
原码、反码:计算机进行运算时中间结果的表示形式;
补码:符号位能直接参与运算,补码也是计算机内的所有整数及整数的运算结果的最终表示。 -
BCD码
计算机中常用四位二进制数来表示一位十进制数,这种编码称为BCD码(Binary Code Decimal)。
根据存储方式的不同,BCD码分为两种:
压缩BCD码和非压缩BCD码
2.3 文本数据
‘a’‘z’、’0’’9’、 ’*’、’#’ 等常用符号在计算机中存储时也用二进制数来表示,为了避免通信混乱,美国有关的标准化组织就出台了(American Standard Code for Information Interchange),即ASCII码,作为计算机间通信时共同遵守的西文字符编码标准,并被国际标准化组织接受。
ASCII码在内存占一个字节。
标准ASCII码值为0~127,适用于所有拉丁文字字母;
扩展ASCII码值为128~255,适用于特殊符号字符、外来语字母和图形符号。
常用的ASCII码值:
‘a’—97(61H)
‘A’—65(41H)
‘0’—48(30H)
为满足各种用户的需求,1990年国际组织开始研发由32位二进制数组成的Unicode (统一码),它为每种语言中的每个字符设定了惟一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
目前ASCII码是Unicode码的一部分。
三种数据表示方式的说明:
- BCD码:用二进制快速表示十进制数,可提高速度和精度
- ASCII码:用于西文字符的机内存储。
- 机器数:用于将符号数值化为0、1,便于计算。
3. 数据的运算功能
3.1 算术运算
- .二进制数算术运算(逢2进1)
- 十六进制数算术运算(逢16进1)
3.2 逻辑运算
- “与”:运算符用“∧”表示,(合取)用于对一个数的某些位清零
- “或”:运算符用“+”或“∨”表示,(析取)用于对一个数的某些位置1
- “非”:设A为逻辑变量,则它的非表示为 A ‾ \overline{\text{A}} A用于对一个数的所有位取反
- “异或”:用于对一个数的某些位取反。
4. IBM PC计算机组织
4.1 微机结构
汇编语言是一种低级语言,与计算机的硬件密切相关,在学习汇编语言之前,必须先了解计算机硬件的基本组织结构。
本门课介绍汇编语言就是8088/8086汇编语言。
8088、8086CPU特性如下:
- 8086是16位机,8088是准16位机。
- 8088与8086的指令系统完全兼容。
- 8088/8086共有14个用户可用寄存器。
- 8088/8086有20根地址线,可寻址 2 20 2^{20} 220=1MB存储空间。
4.2 存储器的组织
4.2.1 存储单元的地址和内容
- 地址
计算机存储信息的基本单位是一个二进制位,一位可存储一个二进制数:0或1。每8个二进制位组成一个字节,8088/8086 的字长是16位,由两个字节组成,即一个字包含两个字节,四个字节组成的存储单元称为双字。
在存储器里以字节为单位存储信息,每一个字节单元分配一个惟一的存储器地址,地址从0开始呈线性增长的。
8086的地址总线为20条,能提供的地址码个数为220=1M个,存储器是按字节编址的,即1M个地址就对应着1M个字节,即:8086能访问1MB的存储器空间,地址范围是:00000H~FFFFFH。
- 内容
一个存储单元中存放的信息称为该存储单元的内容
00002H号字节单元的内容为78H,表示为:(00002H)=78H。
关于字的规定:
一个字存入存储器要占用相继的两个字节,存放时低位字节存入低地址,高位字节存入高地址。这样两个字节单元就构成了一个字单元,字单元的地址采用它的低地址来表示。
00002H号字单元的内容为:5678H
表示为:(00002H)=5678H
关于双字的规定:
双字单元的存放方式与字单元类似,它被存放在相继的4个字节中,低位存入低地址区,高位存入高地址区。双字单元的地址由其最低字节的地址指定。
00002H号双字单元的内容为:12345678H
表示为:(00002H)=12345678H
4.2.2 分段
4.2.2.1 为什么分段?
8086地址总线为20条,能访问的存储器容量为1MB。为了访问这1MB的存储器空间,必须提供20位的地址码,而8086的寄存器为16位,最多能提供216=64K个地址,即最多能访问大小为64KB的存储器空间。这就是常说的8086的16位寄存器与1MB存储器空间之间的矛盾。为了解决这一矛盾,达到遍历1MB内存的目的,引入对存储器地址进行分段的方法。
4.2.2.2 分段方法
存储器的分段管理方法:
计算机中规定:
(1)从0地址开始,每16个字节为一小段;
(2)若干个小段组成一个段,且一个段必须从一个小段的段首开始;
(3)每一段的起始地址为段地址,低4位也一定是0,因此只取高16位;
(4)段内存储单元相对于段首的偏移量称为偏移地址;
(5)段地址和偏移地址合称为逻辑地址。
4.2.2.3 PA和LA
在1MB的存储器空间里,每一个存储单元都有一个惟一的20位地址,称为该存储单元的物理地址。CPU访问存储器时,必须先确定所要访问的存储单元的物理地址才能访问该单元。逻辑地址(Logical Address)和物理地址(Physical Address)都可以定位存储器中的存储单元。
一个存储单元的物理地址是唯一的,而其逻辑地址却是不唯一的。
4.2.2.4 四种段
存储器可分成四种段:
代码段、数据段、附加段和堆栈段
- 代码段:用来存放当前正在运行的程序;
- 数据段:用来存放当前程序所需的数据;
- 附加段:是附加的数据段,它是一个辅助的数据区;
- 堆栈段:定义了堆栈的所在区域。
每个段的最大长度不能超过64KB(原因:216=64K)
4.3 堆栈
是按照“先进后出”(FILO:First In Last Out)原则进行存取的一段特殊的存储器空间。
堆栈的一端是固定的,称为栈底,别一端是浮动的,称为栈顶,数据的插入和删除均在栈顶进行,而且只能以字为单位来进行操作。
5 Intel 8086微处理器
5.1 结构图
5.2 Intel8086寄存器组
寄存器可以分为四类:
通用寄存器、段寄存器、地址寄存器、专用寄存器
5.2.1 通用寄存器:16位寄存器,可用来存放数据、地址
- AX:是算术运算的主要寄存器,高字节AH,低字节AL;
- BX:经常用作基址寄存器,高字节BH,低字节BL;
- CX:常用来保存计数值,高字节CH,低字节CL;
- DX:用于双字长运和I/O指令,高字节DH,低字节DL。
5.2.2 段寄存器:16为寄存器,用来存放段地址
- CS:存放代码段的段地址;
- DS:存放数据段的段地址;
- ES:存放附加段的段地址;
- SS:存放堆栈段的段地址。
5.2.3 地址寄存器:16位寄存器,用来存放偏移地址
- SP:堆栈指针寄存器,访问堆栈时,用来提供堆栈的
栈顶元素的偏移地址; - BP:基址指针寄存器,访问堆栈时,用来提供堆栈中
存储单元的偏移地址; - SI:源变址寄存器,常用于串处理指令;
- DI:目的变址寄存器,常用于串处理指令。
5.2.4 专用寄存器:包括IP和FLAGS
- IP:指令指针寄存器,用来存放代码段中的偏移地址,
始终指向下一条指令的首地址
工作过程:当前指令执行完后,由CS:IP得到物理地址,当这一地址送到存储器后,控制器可以取得下一条要执行的指令,同时,IP自动指向再下一条指令的首地址。
计算机就是用IP寄存器来控制指令序列的执行流程。 - FLAGS:标志寄存器,又称程序状态字(Program Status Word)PSW,用来保存一条指令执行之后,CPU所处状态的信息及运算结果的特征。
共设置了9个标志,共占用2个字节。
根据各标志位功能的不同,分为两类:
条件标志位和控制标志位。
条件标志位:用来记录程序中运行的结果,根据有关指令的运行结果由CPU自动设置。常作为后续条件转移指令的转移控制条件。(6个)
- OF:溢出标志。如果操作数超出了机器能表示的范围称为溢出,此时OF=1,否则OF=0
- SF:符号标志,记录运算结果的符号。结果为负时SF=1,否则SF=0 ‘
- ZF:零标志。运算结果为0时ZF=1,否则ZF=0。
- CF:进位标志,记录运算时从最高有效位产生的进位值。
有进位时CF=1,否则CF=0。 - AF:辅助进位标志,记录运算时第3位(半个字节)产
生的进位值。有进位时AF=1,否则AF=0。 - PF:奇偶标志。当结果中1的个数为偶数时PF=1,否
则PF=0。
控制标志位,控制CPU的工作状态。(3个)
- DF:方向标志位,在串处理指令中用于控制处理信息的方向。当DF=0时,正向(即从低地址向高地址)处理数据串;当DF=1时,反向(即从高地址向低地址)处理数据串。
- IF:中断标志。当IF=1时,CPU开中断,允许CPU响应可屏蔽中断请求,当IF=0时,CPU关中断,屏蔽上述中断请求。
- TF:陷阱标志。当TF=1时,CPU处于单步工作方式,即每执行完一条指令后,CPU自动产生一个陷阱中断,使程序单步执行;当TF=0时,CPU正常工作,不产生陷阱中断,程序正常执行。
6. 输入/输出设备
输入/输出设备与主机通过接口进行联络。
每个接口包括一组寄存器,根据其用途,通常分为三类:
- 数据寄存器:存放要输入/输出设备和主机间传送的数据。
- 状态寄存器:保存输入/输出设备或接口的状态信息。
- 命令寄存器:CPU给输入/输出设备或接口的控制命令通过此寄存器传送出去。
接口中的这些寄存器又称为端口,每一个端口被赋予一个端口地址( 也称端口号 ),端口地址的范围为0000H~FFFFH,共计64K个,8086机器中存储器和端口的编址分属两个不同的地址空间,互不干扰。