- 寄存器一格放8位一个字节
- 伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。
- 数据段提前声明空间,HLAT直接换ASCII码
- CMP 和 JNZ配合使用 ;ZF为标志位; 如果相等ZF=1; JNZ ZF=0时执行;JZ =1时执行;JS SF = 1时执行 JNC 进位为零转移
- 总线周期的含义是计算机执行一条访问内存或端口的机器指令的时间
- 指令周期:从主存中读取一条指令到指令执行结束的时间
- NEG求补,求补运算也可以表达成:将操作数按位取反后加1
- 特别注意SP的增长方向,压栈是减
- 中断类型码:中断类型码为8位二进制数,即0~255 入口地址:中断入口,也就是中断向量 中断类型号: 中断向量: 中断类型号×4=存放中断向量的首地址
微型计算机原理
文章目录
第一章 微型计算机基础知识
1.1微型计算机系统组成
1.微型计算机是指以微处理器为核心,配上存储器,输入/输出接口电路等所组成的计算机。
2.微型计算机系统是由硬件和软件两部分组成。
3.冯诺依曼计算机体系结构:计算机由运算器 、 控制器 、 存储器 、 输入设备 、 输出设备组成
1.2计算机中常用的数制
计算机使用二进制进行编码,而不是我们熟悉的十进制,最重要的原因是二进制物理上更容易实现。
二进制数:B 八进制数:Q 十六进制数:H 十进制数:D
7位ASCII 码 高位b6b5b4 低位 b3b2b1b0
30H: 0 31H: 1
41H: A A的ASCII 位为65
1.3微型计算机中数据的表示方法
16位二进制数称为字 32位为双字
高位在高地址,低位在低地址 称为小端法 反之为大端法
整数
1)无符号数 :只能为正整数。
2)带符号整数(表示法有三种:原码,补码和移码)
原码中零有正负之分 [+0]原=000…00B [-0]原=100.00B
负数的补码:等于其原码除符号位不变其余取反再在最低为加一
第二章 微型计算机组成及微处理器功能结构
2.1微型计算机的组成
微型计算机中央处理部件:CPU
存储器:RAM、ROM
外部设备:输出/输出 设备(6个功能)
总线:将各部件连接起来
- 数据总线DB:用来CPU和其它部件传递信息,具有三态控制功能
- 地址总线AB:地址总线用来传送CPU要访问的存储单元或I/O接口的地址信号
- 控制总线CB:控制总线是CPU向其它部件传送控制信号,以及向其它不部件传送状态信号及请求信号的一组通信线
2.2 8086/8088 及80286微处理器
8086/8088 采用流水线处理技术。将指令执行部件和总线接口分为两个独立的部分
读取操作数的优先权高于取指令
8086/8088 CPU结构功能
16位微处理器
总线周期:CPU通过外部总线对存储器或I/O接口进行一次访问所需要的时间
BIU预取指令和EU执行指令同时需要访问存储器时:EU优先权高
CF:进位标志。
PF:奇偶标志。8位二进制数中1的个数奇偶性
AF:辅助进位标志。看第三位是否有进位或借位。
ZF:零标志位。结果全为零时置1.
SF:符号标志。
OF: 溢出标志。
DF:方向标志,指定字符串处理命令的的步进方向。DF=1高地址向低地址方向进行
IF : 中断允许标志。 IF=1 可接受并响应中断,IF =0 中断屏蔽。
TF: 陷阱标志。控制单步中断 TF=1 执行指令就产生单步中断
4.寄存器阵列:4个寄存器的隐含的专门用法
- AX:累加器
- BX:基址寄存器,用来存放操作数的基地址
- CX:计数寄存器,用于保存指令的计数值
- DX:数据寄存器,用于保存乘法形成的部分结果,或者在指令执行之前用于存放被除数的一部分.
微型计算机系统的总线有两种:内部总线和外部总线 p46
2.2.2 80286CPU的功能结构
80286CPU具有存储器管理和保护机构.它采用分段的方法管理存储器,两种工作方式:实地址方式和虚地址方式
4个独立的处理部件:执行部件(EU) 地址部件(AU) 指令部件(IU) 总线接口部件(BIU)
执行部件:EU包括算术逻辑部件(ALU)及标志寄存器,通用寄存器和控制电路等等
功能:暂存操作数和运算结果
地址部件:AU包括物理地址发生器,段寄存器,段描述符高速缓冲存储器等等
功能:将逻辑地址转为BIU使用的物理地址
指令部件:IU包括指令译码器和已译码指令队列
功能:将指令进行译码
总线接口部件:BIU包括总线接口电路,预取器,和6B的预取队列. BIU优先进行数据存储操作.
功能:
2.2.3 8086/8088的存储器组织及其寻址
偶低奇高 “规则字”
1.8086/8088 CPU中BIU部件和EU部件各包括哪些部件?各自的功能是什么?追踪指令的寄存器是什么?
EU包括:算术逻辑单元、16位标志寄存器、寄存器阵列(4个16位通用寄存器、2个16位指针寄存器和2个变指寄存器)、指令译码及控制电路。EU是执行指令部件,它从指令流队列中取指令,发出相应的命令控制序列,从而执行指令
BIU包括:4个16位段寄存器、1个16位指令指针、1个地址加法器、1个指令流队列和总线控制电路。BIU也可以根据EU请求与I/O接口电路交换数据.也可以合成物理地址.
追踪指令的寄存器是:IP
操作数地址EU计算出16位的偏移量送BIU,BIU将其与段寄存器合成,得到一个20位的内存单元物理地址,与内存单元交换数据 也可以根据EU请求和IO接口电路交换数据
3.8086/8088CPU有哪几个状态标志?哪几个控制标志?各标志位的含义和功能是什么?
6个状态标志:
AF ZF CF PF OF SF
3个控制标志: DF IF TF
4.8086/8088CPU的存储器组织为什么要采用分段结构?逻辑地址和物理地址的关系是什么?若已知逻辑地址为B100:A300H试求物理地址。
为了模块化程序 多道程序及多用户程序的设计提供了方便
8.80286CPU相对于8086CPU来说,有哪些改进和提高?
多了两个部件:地址部件和指令部件
地址部件:AU包括物理地址发生器,段寄存器,段描述符高速缓冲存储器等等
功能:将逻辑地址转为BIU使用的物理地址
指令部件:IU包括指令译码器和已译码指令队列
功能:将指令进行译码
9.80386CPU由那六部分组成?各有何功能?试说明80386CPU较80286CPU的先进之处,并说明486SX与486DX的区别。
总线接口部件(BIU):用于将CPU与外部总线连接起来。
指令预取部件:进行指令的预取,预取器保持预取队列总是满的。
指令译码部件:指令译码部件为指令的执行做好了准备。
执行部件:将已译码指令队列中的内部码变成按时间顺序排列的一系列控制信号,并发向处理器的其它处理部件。
分段部件:把逻辑地址转换成线性地址。
分页部件:将分段部件或代码预取部件产生的线性地址转化成物理地址。
80386 新增的控制标志:
- 重新启动标志(RF):用来调试故障是否能接受。当RF=0时,调试故障被接受并应答;当RF=1调试故障忽略。
- 虚拟8086方式标志:VM=1,表示在虚拟8086方式下运行,VM=0,处理器将在一般方式下运行。
13.何谓CISC技术及RISC技术?各有何特点?各自的代表性产品是什么?
CISC复杂指令集计算机:是一种为了便于编程和提高访问效率的芯片设计体系。代表产品:Intel的80X86.
RISC精简指令集计算机:使取指令和分析指令变得方便和效率高,降低了电路的复杂度。代表产品:SBM SUN
14.冯诺依曼结构计算机的特点是什么?哈佛结构计算机的特点是什么?80X86系列微处理器属于哪种结构?
冯·诺依曼结构(von Neumann architecture)又称作普林斯顿体系结构(Princetion architecture)。冯·诺依曼结构的处理器使用同一个存储器,经由同一个总线传输。冯·诺依曼结构处理器具有以下几个特点:
- 必须有一个存储器;
- 必须有一个控制器;
- 必须有一个运算器,用于完成算术运算和逻辑运算;
- 必须有输入和输出设备,用于进行人机通信。
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度
哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令。
哈佛结构是指程序和数据空间独立的体系结构, 目的是为了减轻程序运行时的访存瓶颈。
哈佛结构能基本上解决取指和取数的冲突问题。
冯·诺依曼体系和哈佛总线体系的区别
二者的区别就是程序空间和数据空间是否是一体的。冯·诺依曼结构数据空间和地址空间不分开,哈佛结构数据空间和地址空间是分开的。
80X86系列微处理器属于是诺依曼结构
第三章 80x86寻址方式和指令系统
3.1概述
操作数分为三类:立即数、寄存器和存储器操作数
3.2 80x86的寻址方式
分为两种:
- 一种为寻找操作数的地址,称为数据寻址
- 寻找要执行的下一条指令的地址,即程序转移或子程序调用时的目的地址或入口地址
3.2.2 程序转移地址寻址方式
段内直接寻址
1.段内寻址:EA=(IP)+disp
dis:位移量
位移量为8位时,称为短程转移 位移量为16位时,称为近程转移
汇编语言格式 :
- JMP NEAR PTR 符号地址
- JMP SHORT 符号地址
段内间接寻址:
- JMP 寄存器
- JMP 存储单元
仅修改IP的内容
段间直接寻址:指令中直接给出程序段转移的代码代码段地址和偏移地址来取代当前的CS 和IP
- JMP FAR PTR 符号地址
- FAR PTR 表示段间转移的操作符
段间间接寻址:
- JMP DWORD PTR 存储单元[BX]
连续选四个地址 先IP 后CS
3.3 指令格式
3.3.2 指令编码格式
8086指令系统的16位数操作指令由1-7个字节组成,最少一个字节,其包括操作码、寻址方式及操作数部分(位移量、立即数)
操作码字节:OPCODE + D +W
D=0 表示REG 指定的寄存去操作作为源操作数 D=1 REG域指定的寄存器操作数作为目的操作数
W=0 为 字节 W=1 为字
寻址方式字节:
MOD + REG + R/M
MOD域 :选择寻址类型 ,如果是存储器则要指明是否有偏移量
REG域:规定寄存器操作数
R/M域:表示寄存器或存储器,受MOD域控制。如果为存储器则有8种组合寻址的方式
3.4.1数据传送类指令
1)基本的传送指令
传送指令----mov
mov DST ,SRC
注意:
- 目的操作数不得为立即数。如 mov 12H,BL为非法指令
- 不影响标志位
- 操作数类型必须一致 如MOV AX,BL为非法指令 应为 MOV AL,BL
- 源操作数为非立即数时,两操作数之一必为寄存器 如:mov [DX],[SI]为非法指令
- 目的操作数为段寄存器(CS和IP或EIP不能作为目的寄存器)源操作数不得为立即数
- 不能在段寄存器之间进行直接数据传送 如 MOV DS,ES 为非法指令
PUSH指令的限制:
在8086系统不允许使用立即数寻址
交换AX,BX寄存器内容
PUSH AX
PUSH BX
POP AX
POP BX
一共8个通用寄存器(AX BX CX DX SP BP SI DI)
通用数据传送类指令:
MOV:
MOVSX: MOVSX EAX,CX ; 就是将扩展的那几位置为FFFF后面接上CX的值 FFFFCX
MOVZX:与上面的相同但是扩展的那几位补零
PUSH :PUSH SRC ; POP DST 栈是从高地址向低地址增长的
PUSHF/PUSHFD:PUSHF ; POPF ;PUSHFD ;POPFD; 将FLAGS/EFLAGS标志寄存器中的内容压入堆栈;
POP:
XCHG: XCHG DST, SRC ;将两个操作数的内容互相交换
CMPXCHG :将累加器(AX)中的内容与目的操作数相比较。如果相等则将源操作数拷到目的操作数所指单元,且置ZF=1,如果不相等则将目的操作数拷贝到累加器中且置ZF=0
XADD:XADD DST ,SRC ;加法指令但是原来的目的操作数被存入源操作数所指单元
BSWAP:BSWAP REG32 ;将指令指定的32位寄存器的字节次序变反。
XLAT:换码指令.
地址传送指令
LEA REG,SRC (REG)<-SRC
将源操作数的有效地址EA传送到指定寄存器中
源操作数的寻址方式只能是存储器选址方式(不允许是立即数和寄存器寻址方式)
LDS REG ,MEN ; (REG)<-(MEM) (DS)<-(MEM+2)
标志传送指令
LAHF ;(AH)<-(FLAGS的低字节5个状态标志)
SAHF 和上面刚好相反
输入输出指令
IN 和out输入输出指令 累加器专用指令.
3.4.2算数运算指令
MUL和DIV操作的都是AX累加器
IMIL IDIV 计算带上符号位,然后就是使用变补运算
1.加/减指令 —ADD/SUB ADC/SBB(带进位借位)
ADD DST,SRC ; SUB DST,SRC
ADC/SBB —带进/借位的加加减法,带上CF的值一起与操作数相加减。
2.增减指令----INC/DEC 不影响CF标志位 将目的操作数的内容加减1
3.求补指令—NEG
NEG DST; 说白了就是取绝对值
4.比较指令
CMP DST ,SRC;考虑ZF 如果等于一说明相等 否则就要考虑是不是带符号数的比较了
比较指令只改变标志位的减法
数据类型必须一致 目的操作数不为立即数 两个操作数之一必为寄存器 两操作数不允许为段寄存器
2.乘法指令
无符号—MUL
指令格式:MUL SRC;
功能:将目的操作数(AX)乘以源操作数,结果存放到目的操作数中。
限制:不允许为立即数,可以是寄存器
有符号-IMUL
这里有省略
3.除法指令
无符号除法----DIV
指令格式:DIV SRC;
功能:目的操作数(AX)除以源操作数,结果存放到目的操作数中。
限制:不允许为立即数,可以是寄存器或存储器中的数据
有符号除法—IDIV
除数如果是负数,用补码计算,余数不变,商为变补。
4.BCD码
加法十进制调整指令 :DAA
指令格式 DAA
5.符号拓展指令
字节转字 – CBW CBW;
CWD
CWDE ----字节转指令
CDQ ----双字转四字
3.4.3逻辑运算和移位类指令(操作数)
1.逻辑运算指令(AND、OR、NOT、XOR、TEST)
逻辑与----AND
NOT --逻辑非
NOT DST :目的操作数按位取反
XOR:结果存目的操作数
TEST:结果不保存,但是影响标志位,可以用来屏蔽某些位
TEST DST,SRC
和JZ匹配使用
2.移位指令
算数是SA,逻辑是SH
算数移位和逻辑移位
算数逻辑左移SAL/SHL SAL/SHL DST,CNT
算数右移SAR:SAR DST,CNT
3.循环移位指令:
ROL—循环左移指令
ROL DST,CNT
ROR----循环右移
RCL—带进位的循环左移
RCR----带进位的循环右移
带进位的移动CF公用
3.4.4位操作指令(操作数)
先将DST指定的位数先赋值给CF然后再将指定的位置数
1.位测试和设置指令
BT DST,SRC 指定位值不变,位数右到左从零开始数
BTC DST,SRC 指定为置0
BTR 我看书我觉得是应用于多位的
BTS 指定位置1
功能:将目的操作数DST中某位的值复制到CF,改位位号由源操作数SRC提供
2.位扫描指令
指令格式: BSF DST , SRC 从低位到高位
BSR DST ,SRC 从高位到低位
3.4.5串操作指令 (SI 、DI、CX)
串操作指令就是对一个字符串进行操作、处理、如传送、比较、查找、插入、删除
所有串操作指令都用寄存器E(SI)对源操作数进行间接寻址,用E(DI)对目的操作数寻址
源操作数和目的操作数都在存储器中的指令
DF方向标志 DF=0 自动增量修改 DF=1自动减量
CX做重复次数计数器
1.重复前缀指令
1.重复前缀指令----REP 重复其后指令串的操作直至(CX=0)
先判断条件再CX-1
再执行指令
2.相等/为零则重复前缀指令----REPE/REPZ
3.不相等/不为零则重复浅醉指令----REPNE/REPNZ
2.串操作指令
1)串传送指令----MOVS
MOVS DST,SRC
MOVSB :((ES):E(DI))<-((DS):(E)SI) 将源串送到目的串
MOVSW
MOVSD
指令执行之前的前置条件:
- 源串首地址---->(E)SI
- 目的串首地址---->(E)DI
- 串长度---->(E)CX
- 建立方向标志(CLD 使DF=0,STD使DF=1、CX)
2)串比较指令-----CMPS
CMPS DST,SRC
只进行比较并不返回结果,相等ZF=1, 不相等ZF=0
- 串扫描或称串搜索 ----SCAS (搜索的关键字默认放在CL中)
SCAS DST
SCASB(字节); (AL)-((ES):(E(DI))),(AL)-((ES):(E(DI)))加减一 自动变化
结果只影响标志位,寻找方式就是减法 ZF=1说明找到目的字符
4)串装入指令
LODS SRC
LODSB ;(AL)<-((DS):(E(SI))),(AL)<-((DS):(E(SI)))加减1
将源串装如累加器中
5)串存储指令
STOS DST
STOSB;((ES):(DI))<-AL ,((E)DI<-((E)DI))加减一
6)串输入指令
INS DST,DX ; ((ES):(ID))<-((DX))
根据DX给出的端口,从外设读入数据并送入目的串存储单元
7)串输出指令–OUTS
和上面刚好相反
3.4.6转移指令(累加可以使用SI)
JMP段内寻址 都是只改变IP的值
JMP段间寻址 改变的CS IP 的值
1)无条件转移指令—JMP
JMP DST
无条件跳转到指令指定的目标地址DST去执行指令
和前面段间 段内 结合使用
2)条件转移指令(jump if cc)—Jcc
Jcc DST
如果测试条件cc为真则跳转到目标地址DST处执行程序
无符号数比较为高低 看CF 和ZF
有符号为大小 看OF异或SF ZF
3)循环转移指令
指令格式:LOOPcc DST
如果CX的内容不等于0,且测试条件“cc”成立,则转到由目的操作数dst所寻址单元处执行程序 执行循环CX-1
4)子程序调用指令
1)调用指令(call)—CALL
CALL DST
相当于 PUSH CS
PUSH IP
JMP DST
主程序用CALL指令来调用子程序
段内直接调用 CALL NEAR PTR PROC ;(IP)<-(IP)+disp16
段间直接调用 CALL FAR PTR PROC ; (IP)<-(EA) (CS)<-PROC
段内间接调用 CALL DST ;(IP)<-(EA)
段间间接调用 CALL DST ;(IP)<-(EA) (CS)<-(EA+2)
3.4.7处理器控制指令
1)空操作指令–NOP 仅仅占用三个时钟周期,执行NOP指令后,CPU继续执行下一条指令
2)暂停指令–HLT 只有重启或有非可屏蔽中断和可屏蔽中断发送时,才能继续执行下一条指令
3)等待指令—WAIT 检查TEST引脚的状态,用于CPU与协处理器和外部设备同步。直到执行完下一条指令后才运行外部中断。
4)总线封锁指令(LOOK)封锁外部总线直至本指令执行完毕
5)交权指令(ESC)
CALL指令的功能是先将断点地当前IP和CS压入堆栈,然后将子程序的首地址装入IP和CS中,从而将程序转移到子程序的入口
2)返回指令ret
相当于 POP IP
POP CS
第四章汇编语言程序设计
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oe4iDE5W-1669980868730)(微型计算机原理.assets/image-20221125214305262.png)]
汇编程序如何变为机器语言:
汇编语言源程序.ASM---->汇编程序assembler(汇编器)---->机器语言目标程序.obj
汇编程序在屏幕上显示“Hello World”
DISP MACRO POS
MOV DX,OFFSET POS
MOV AH,09
INT 21H
ENDM
STACK SEGMENT stack
DW 256 DUP(?)
STACK ENDS
DATA SEGMENT
STR1 DB 'Hello World'
LEN EQU $-STR1
DB 0DH,0AH,'$' #类似/r/n
STR2 DB LEN DUP(?)
DB 0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
DISP STR1
LEA SI,STR1
ADD SI,LEN-1
LEA DI,STR2
MOV CX,LEN
L1: MOV AL,[SI]
MOV [DI],AL
INC DI
DEC SI
LOOP L1
DISP STR2
MOV AH,4CH
INT 21H
CODE ENDS
END START
4.2.1汇编语句格式
助记符是每条语句必不可少的部分
前缀指令LOCK或REP应加在某些需要的相关指令之前,不能独立使用
4.2.2汇编语言语句的数据项
1.常数可以分为:
-
数值型常数:二 、十、十六进制
-
字符串常数:用引号括起来的一个或多个ASCII码
注意十六进制以A-F开头的十六进制数一定要在前面加一个数字零
2.标号(lable)
具有:段、偏移地址、类型三种属性,类型属性有两种:NEAR和FAR
3.变量
有段(SEG)、偏移地址(OFFSET)、类型(TYPE)三种属性
格式:
变量名 DB(DW、DD、DQ、DT) 表达式 ;
以上DB等为伪指令,可以为变量分配存储空间
变量声明如果存储字符型,如果超过两个字符要使用DB
DW、DD在地址表达式中使用 P127
eg:DATA11 DW DATA4 找到DATA4 把偏移地址给DATA11 然后存在内存中
eg:DATA12 DD DATA4 把段地址和偏移地址一起存,偏移地址在低地址,段地址在高地址
4.表达式
运算符有四类:算数运算符、逻辑运算符、关系运算符、属性运算符
算数运算符:加减乘除取模 mod取余数
逻辑运算符:AND OR NOT XOR
运算按位进行
关系运算符:EQ等于 NE不等于S LT小于 GT大于 LE小于等于 GE大于等于
属性操作符:
SEG: 格式 SEG变量/标号 汇编结果回送或取出变量或标号所致的段地址
OFFSET:OFFSET 变量/标号 取出变量或标号的偏移地址
TYPE: TYPE 变量/标号
TYPE变量 DB:1 DW :2 DD:4 DQ:8 DT:10
TYPE标号: NEAR :-1 FAR :-2
SIZE变量 取出变量大小
SIZE=LENGTH x TYPE
重新定义类型操作符-PTR
格式:类型 PTR 表达式
4.2.3伪指令
1.段定义伪指令:
SEGMENT/ENDS
其格式为:
段名 SEGMENT [定义类型][组合类型][类别]
段名 ENDS
所定义的段小于64KB
(定位类型)PAGE PARA WORD BYTE
ASUUME伪指令
指明所定义的段与段寄存器的对应关系
格式:
ASSUME 段寄存器名:段名符 ,
2.程序结束伪指令
END 标号(表达式)
eg:END START
4.程序开始伪指令
1)PAGE 伪指令是为汇编程序所产生的列表文件指定每页的行数和列数
PAGE 参数1,参数2
2)TITLE 伪指令 可为程序指定列表文件的每一页上打印出标题
5.赋值伪指令
1)EQU 伪指令
名称 EUQ 表达式
eg:8259A EQU 20H
作用与“=”相似但不同的是“=”允许重复定义表达式名称,而EQU不允许
说白了就是只能赋值一次
2)取消标号—PURGE
与EQU 相对于
6.定义名称类型伪指令----LABLE
格式:名称 LABEL 类型
eg:BA LABEL TYPE
NEXT LABEL NEAR
MOV AX.BX 等价于 NEXT: MOVE AX,BX
7.地址计数器伪指令
1)$伪指令
$表示当前正在汇编指令的地址
LEN EQU $-STR1
2)ORG 伪指令
此指令指明ORG语句后的程序段的段内起始地址
8.结构体定义STRUCT/ENDS
结构体名 STRUCT
结构体名 END
9.控制汇编语言程序伪指令
1)IF 语句
.IF 表达式
语句1
.ELSE
语句二
.ENDIF
2)DO WHILE 语句
.WHILE 表达式
.ENDW
3)REPEAT-UNTIL 表达式
.REPEAT
语句
.UNTIL 表达式
先执行 REPEAT再测试表达式
4.2.4宏定义
宏指令名 MACRO <形式参数>
宏体
ENDM
宏调用
格式:宏指令名 <实际参数>
便面宏展开后标号重复定义我们使用??0000来替代程序中的标号
4.3编制汇编程序的步骤:
明确任务—>绘制流程图---->编写源程序----->上机调试---->形成文档
4.4.3子程序设计
子程序由CALL指令调用和RET指令返回,所以汇编后子程序的机器码只产生一次,调用的次数越多消耗的内存越多。
子程序调用和返回都需要时间,执行速度慢,宏指令不需要这个过程,运行速度快
对一个程序块访问次数少时使用子程序,多的话使用宏定义
1.过程的定义和调用
过程名 PROC 属性
RET
过程名 ENDP
2.寄存器内容的保护和恢复
主程序和子程序是分开编程的,因而他们所使用的寄存器往往会发生冲突,所以我们在进入子程序之前汇报子程序所用寄存器的内容跟保护起来,这称保护现场
3.主程序和子程序间的参数传递
- 用CPU 内部的寄存器传递参数
- 指定内存单元变量传递参数
- 通过地址表传送变量地址
- 通过堆栈传递参数或参数地址
4.4 汇编程序及上机过程
源文件.ASM ---->编辑----.ASM—>汇编–.OBJ/.LST/.CRF–>连接–.EXE–>调试---->运行
编辑:建立汇编源程序,并以ASCII形式存入内存缓冲区
汇编(MASM):将汇编程序翻译后生成扩展名为
连接(LINK):将.obj文件与系统提供的.LIB库文件连接,形成可执行文件
4.4.2汇编程序对源程序的汇编过程
两次扫描源程序:
第一次:扫描确定各标识符的位置,建立符号表
第二次:根据指令表、指令码表、符号表产生机代码
4.5DOS及BIOS功能调用
软中断可以分为三部分:DOS中断、ROM BIOS 中断、自由中断
DOS专用中断 INT22H 、INT 23H、 INT 24H
DOS可调用中断:INT 20H、INT 27H(程序退出 ) INT 21H(系统功能调用) INT 25H INT 26H (磁盘R/W中断)INT 2FH(假脱机打印文件)
第五章 8086/8088CPU 的引脚功能
8086/8088 CPU 在引脚功能上的几点不同
- 由于8088只能传输8位数据,因而8088只有8个地址引脚兼作数据引脚,而8086有16个地址/数据复用引脚
- 8086处理器的28号引脚为M/非IO,而8088为IO/非M,即有效电平相反
- 8086处理器的34号引脚为非BHE/S7,而8088为非SS0。
当存储器或I/O设备读/写速度较慢时,应如何向CPU 申请等待时间?
系统中就要用一个电路来产生READY信号。低电平的READY信号必须在T3状态启动之前向CPU发出,则CPU将会在T3状态和T4状态之间插入若干个等待状态Tw,直到READY信号变高。
每一个设备都有一个中断,当存储器负荷满的时候,就会向CPU发送BUSY,CPU就会暂停向该设备发送命令,直到存储器发送READY,CPU才会继续发送指令
最小模式:一个微处理器,CPU直接产生所有的总线控制信号,系统所需要的外加其他总线控制逻辑部件最少
最大模式:两个或多个处理器,一个为主处理器,8086/8088有两个协处理器、一个为数值运算协处理器,可以大幅提高系统的运算速度。另一个为输入/输出操作的协处理器
CPU引脚功能 P198
5.2系统的总线时序
电复位:通电之后都置成我们预先已知的与要求的内容和状态
中断周期:时钟周期是CPU的基本时间计量单位,他由计算机主频决定。
总线周期:CPU通过系统总线对外部存储器或I/O接口进行一次访问所需的时间
当存储器和外设速度较慢时,要在T3状态后插入1个或几个等待状态Tw
第八章 中断和异常
8.1概述
1.中断主要包括外部中断和内部中断两种
中断:计算机在执行正常程序的过程中,如果出现某些异常事件或某种外部请求时,处理器就暂停执行当前程序,而转去执行对异常事件或某种外部请求的处理操作。
微处理器对中断源的检测主要是通过三种中断技术:单线中断、多级中断和矢量中断(现代处理器采用的技术)
803866及80486已将矢量号0~31分配给异常
中断及软中断指令的矢量号可在0~255范围内选择 最好在32~255范围内选择
8.2中断
80386、80486支持两种类型的中断:可屏蔽中断及不可屏蔽中断并有相应的两个中断请求引脚信号—INTR 及 NMI
8.2.1可屏蔽中断
经INTR信号(高电平)请求的中断称为可屏蔽中断。它受中断允许标志位IF的影响和控制。
当IF被软件采用STI指令置1时,表明可屏蔽中断被允许CPU响应可屏蔽中断。
当IF被软件采用CLI指令置0时,表明可屏蔽中断被禁止
8.2.2 非可屏蔽中断
经由NMI信号线(边沿触发)请求的中断称为非可屏蔽中断。他是不被IF禁止的中断。非可屏蔽中断被响应时,其中断矢量号不由外部中断源提供,而是由系统提供, 非屏蔽中断的矢量号为2,它的优先级高于可屏蔽中断。
8.3异常
异常类别:故障,陷阱,中止
故障:是引起该故障可被恢复执行的异常,它也是在引起故障的指令执行之前就报给告给系统的一种异常
陷阱:陷阱是在指令执行期间被检测到的,并在引起异常的指令执行之后向系统报告的一种异常。
中止:是微处理器面临严重错误时产生的
P316-320
8.3.3处理器定义的异常
异常0 后面直接用数字表示
0:除法出错
1:调试异常
3:断电中断
4:溢出陷阱
5:边界检查故障
6:无效操作码故障
7:协处理器无效
8:双重故障
9:协处理器段越界异常
10:无效TSS故障
11:段不存在异常
12:栈段故障
13:通用保护故障
14:页故障
16:协处理器出错故障
8.4中断和异常的暂时屏蔽
引起中断和排错异常被忽略及屏蔽的条件如下:
1.若FLAGE中的IF=0,则屏蔽外部可屏蔽中断
2.IF=0,执行ST1,则在ST1指令及下面一条指令执行期间,屏蔽外部可屏蔽中断
3.EFLAGS中的RF=1,则屏蔽排错故障
4。系统正在处理一个非屏蔽外部中断,则屏蔽任何新的非屏蔽中断
5.执行中包含堆栈操作,则一定要等到下一条指令完成后才能响应中断
6.发出中断请求信号时,恰好遇上CPU 执行封锁指令LOCK,必须等其和其下一条指令执行完成后才能响应中断
8.5中断及异常的优先级
除法出错 >中断指令INT n>溢出中断>非屏蔽中断>NMI>可屏蔽中断INTR>单步中断
8.6实地址方式下的中断
微处理器采用中断矢量表的方法来存储转入中断处理程序的入口地址
中断矢量号X4即为相应中断矢量号对应的矢量地址
8259A的初始化命令字:
ICW1—ICW4
数字是下标
初始化命令字对8259A芯片进行初始化编程
**ICW1命令字:**LTIM 用来设定中断请求信号的有效形式。LTIM=1,表示中断请求信号高电平有效。LTIM=0,表示中断请求信号IR0~IR7上跳沿有效。SNGL=1 8259A是单片工作方式 ,级联工作方式(SNGL=0)IC4位为1,表示后面还要设置初始化命令字LCW4
**ICW2命令字:**用来设置中断类型基号值。高五位即ICW2的高五位,低三位由中断响应信号IR0~IR7决定
ICW3命令字:用于8259A级联方式时,指明主8259A的哪个中断源与从8259A的INT引脚相连。ICW3命令字设置时采用奇数地址
**ICW4命令字:**设置嵌套方式、缓冲方式、描述中断结束方式、模式
8259A的操作命令字:
操作命令字对8259A进行过程编程
OCW1操作命令字:该命令字用来设置中断源的屏蔽状态。
**OCW2操作命令字:**来控制中断结束方式及修改优先权管理方式。
**OCW3操作命令字:**用来管理特殊的屏蔽方式和查询方式