微机原理与应用微机原理与接口技术复习资料期末复习完美整合版Word格式文档下载.docx
《微机原理与应用微机原理与接口技术复习资料期末复习完美整合版Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《微机原理与应用微机原理与接口技术复习资料期末复习完美整合版Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
负责与存储器、I/O端口传送数据
执行部件(EU):
负责指令的执行
协调工作过程:
总线接口部件和执行部件并不是同步工作的,它们按以下流水线技术原则来协调管理:
①每当8086的指令队列中有两个空字节,或者8088的指令队列中有一个空字节时,总线接口部件就会自动把指令取到指令队列中。
②每当执行部件准备执行一条指令时,它会从总线接口部件的指令队列前部取出指令的代码,然后用几个时钟周期去执行指令。
在执行指令的过程中,如果必须访问存储器或者输入/输出设备,那么,执行部件就会请求总线接口部件进入总线周期,完成访问内存或者输入/输出端口的操作;
如果此时总线接口部件正好处于空闲状态,那么,会立即响应执行部件的总线请求。
但有时会遇到这样的情况,执行部件请求总线接口部件访问总线时,总线接口部件正在将某个指令字节取到指令队列中,此时总线接口部件将首先完成这个取指令的操作,然后再去响应执行部件发出的访问总线的请求。
③当指令队列已满,而且执行部件又没有总线访问请求时,总线接口部件便进入空闲状态。
④在执行转移指令、调用指令和返回指令时,由于程序执行的顺序发生了改变,不再是顺序执行下面一条指令,这时,指令队列中已经按顺序装入的字节就没用了。
遇到这种情况,指令队列中的原有内容将被自动消除,总线接口部件会按转移位置往指令队列装入另一个程序段中的指令。
3.什么是指令周期?
什么是总线周期?
什么是时钟周期?
它们之间的关系如何?
指令周期----CPU执行一条指令所需要的时间称为一个指令周期(InstructionCycle)。
总线周期----每当CPU要从存储器或I/O端口存取一个字节称为一次总线操作,相应于某个总线操作的时间即为一个总线周期(BUSCycle)。
时钟周期----时钟周期是CPU处理动作的最小时间单位,其值等于系统时钟频率的倒数,时钟周期又称为T状态。
它们之间的关系:
若干个总线周期构成一个指令周期,一个基本的总线周期由4个T组成,我们分别称为T1~T4,在每个T状态下,CPU完成不同的动作。
4.8086/8088CPU有哪些基本操作?
基本的读/写总线周期各包含多少个时钟周期?
什么情况下需要插入Tw周期?
应插入多少个Tw取决于什么因素?
①8086/8088CPU最小模式下的典型时序有:
存储器读写;
输入输出;
中断响应;
系统复位及总线占用操作。
②一个基本的CPU总线周期一般包含四个状态,即四个时钟周期;
4321TTTT、、、③在存储器和外设速度较慢时,要在之后插入1个或几个等待状态;
3TwT④应插入多少个取决于READY信号的状态,CPU没有在状态的一开始采样到READY信号为低电平,就会在和之间插入等待状态,直到采样到READY信号为高电平。
wT3T3T4TwT
5.试说明8086/8088工作在最大和最小模式下系统基本配置的差异。
8086/8088微机
系统中为什么一定要有地址锁存器?
需要锁存哪些信息?
解答:
最大模式配置和最小模式配置有一个主要的差别:
①就是在最大模式下,需要用外加电路来对CPU发出的控制信号进行变换和组合,以得到对存储器和I/O端口的读/写信号及对锁存器(8282)和对总线收发器(8286)等等的控制信号。
8288总线控制器就是完成上面这些功能的专用芯片。
②为多中断源的需要,常采用中断优先权控制电路(如Intel8259A)。
8086/8088系统一定要有地址锁存器――因为高四位地址和状态信号是从同一组引脚上分时送出的,低16位地址和数据是从同一组引脚上分时传输的,所以必须把地址信息锁存起来。
需要锁存的信息:
地址信号、7/SBHE和MIO/(8086为IOM/)信号进行锁存。
6.试简述8086/8088微机系统最小模式下从存器储读数据时的时序过程。
正常的存储器读总线操作占用4个时钟周期,通常将它们称为4个T状态即T1~T4。
①T1状态,IO/M=0,指出要访问存储器。
送地址信号A19-0,地址锁存信号ALE有效,用来控制8282锁存地址。
DT/R=0,控制8286/8287工作在接收状态(读)。
②T2状态,A19~A16送状态S6~S3,AD7~AD0浮空,准备接收数据。
同时,RD=0,表示要进行读操作,而DEN=0作为8286/8287的选通信号,允许进行数据传输。
③T3状态,从指定的存储单元将数据读出送AD7~AD0。
若存储器速度较慢,不能及时读出数据的话,则通过READY引脚通知CPU,CPU在T3的前沿采样READY,如果READY=0,则在T3结束后自动插入1个或几个等待状态TW,并在每个TW的前沿检测READY,等到READY变高后,就自动脱离TW进入T4。
④T4状态,CPU采样数据线,获得数据。
RD、DEN等信号失效。
7.8086/8088CPU中有哪些寄存器?
各有什么用途?
标志寄存器F有哪些标志位?
各在什么情况下置位?
寄存器功能:
数据寄存器,AX字乘法,字除法,字I/O;
BX查表转换;
CX串操作,循环次数;
DX字节相乘,字节相除,间接I/O
变址寄存器:
SI源变址寄存器,用于指令的变址寻址;
DI目的变址寄存器,用于指令的变址寻址;
指针寄存器:
SP堆栈指针寄存器,与SS一起来确定堆栈在内存中的位置;
BP基数指针寄存器,用于存放基地址,以使8086/8088寻址更加灵活.控制寄存器:
IP控制CPU的指令执行顺序;
PSW用来存放8086/8088CPU在工作过程中的状态;
段寄存器CS控制程序区;
DS控制数据区;
SS控制堆栈区;
ES控制数据区.标志寄存器F的标志位:
①控制标志:
OF、DF、IF、TF;
②状态标志:
SF、ZF、AF、PF、CF。
标志寄存器F的各标志位置位情况:
·
CF:
进位标志位。
做加法时出现进位或做减法时出现借位,该标志位置1;
否则清0。
PF:
奇偶标志位。
当结果的低8位中l的个数为偶数时,该标志位置1;
AF:
半进位标志位。
在加法时,当位3需向位4进位,或在减法时位3需向位4借位时,该标志位就置1;
该标志位通常用于对BCD算术运算结果的调整。
ZF:
零标志位。
运算结果各位都为0时,该标志位置1,否则清0。
SF:
符号标志位。
当运算结果的最高位为1时,该标志位置1,否则清0。
TF:
陷阱标志位(单步标志位)。
当该位置1时,将使8086/8088进入单步指令工作方式。
在每条指令开始执行以前,CPU总是先测试TF位是否为1,如果为1,则在本指令执行后将产生陷阱中断,从而执行陷阱中断处理程序。
该程序的首地址由内存的00004H~00007H4个单元提供。
该标志通常用于程序的调试。
例如,在系统调试软件DEBUG中的T命令,就是利用它来进行程序的单步跟踪的。
IF:
中断允许标志位。
如果该位置1,则处理器可以响应可屏蔽中断,否则就不能响应可屏蔽中断。
DF:
方向标志位。
当该位置1时,串操作指令为自动减量指令,即从高地址到低地址处理字符串;
否则串操作指令为自动增量指令。
OF:
溢出标志位。
在算术运算中,带符号的数的运算结果超出了8位或16位带符号数所能表达的范围时,即字节运算大于十127或小于-128时,字运算大于十32767或小于-32768时,该标志位置位。
CH028086/8088指令系统
1.Z=(W*X)/(R+6)(4)Z=((W-X)/5*Y)*2
MOVDX,0MOVAX,W
MOVAX,WMOVBX,X
MOVBX,XSUBAX,BX
MULBXMOVDX,0
PUSHAXMOVCL,5
MOVAX,RDIVCL
ADDAX,6MOVBX,Y
MOVCX,AXMULBX
POPAXMOVCL,2
DIVCXMULCL
MOVZ,AXMOVZ,AX
MOVZ+1,DXMOVZ+1,DX
2.编写一段程序,比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串,则执行NEW_LESS,否则顺序执行。
编程如下,(说明:
左测程序为常规编法,两个字符串在一个数据段中;
右测的程序要求OLDS在数据段中,NEWS在附加段中,利用串操作的指令是可行的)
LEASI,OLDS;
LEASI,OLDS
LEADI,NEWS;
LEADI,NEWS
MOVCX,5;
MOVCX,5
NEXT:
MOVAL,[SI];
CLD
MOVBL,[DI];
REPECMPSB
CMPAL,BL;
JNZNEW_LESS
JNZNEW_LESS;
……
INCSI;
JMPEXIT
INCDI;
NEW_LESS:
LOOPNEXT;
……EXIT:
JMPEXIT
NEW_LESS:
……
EXIT:
3.若在数据段中从字节变量TABLE相应的单元开始存放了0~15的平方值,试写出包含有XLAT指令的指令序列查找N(0~15)的平方。
(设N的值存放在CL中)
MOVBX,OFFSETTABLE;
LEABX,TABLE;
MOVCL,N;
MOVAL,CL;
XLAT
4.有两个双字数据串分别存放在ASC1和ASC2中(低字放低地址),求它们的差,结果放在ASC3中(低字放低地址)。
ASC1DW578,400;
ASC2DW694,12;
ASC3DW?
,?
编程如下,LEASI,ASC1;
LEADI,ASC2;
LEABX,ASC3;
MOVCX,2;
CLC;
MOVAX,[SI];
MOVDX,[DI];
SBBAX,DX;
MOV[BX],AX;
INCSI;
INCDI;
INCBX;
LOOPNEXT
CH03汇编语言程序设计
1.下列语句在存储器中分别为变量分配多少字节空间?
并画出存储空间的分配图。
VAR1DB10,2;
VAR2DW5DUP(?
),0;
VAR3DB‘HOWAREYOU?
’,3DUP(1,2);
VAR4DD-1,1,0
字节空间----VAR1:
2;
VAR2:
12;
VAR3:
20;
VAR4:
12。
存储空间的分配图:
DS:
00000A02000000000000—000000000000484F
00105720204152452020—594F553F01020102
00200102FFFFFFFF0100—000000000000
2.假定VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处。
(1)ADDVAR1,VAR2
(2)SUBAL,VAR1(3)JMPLAB[CX](4)JNZVAR1(5)MOV[1000H],100(6)SHLAL,4
(1)两个操作数中至少有一个为寄存器;
(2)AL为字节,VAR1为字变量,不匹配;
(3)[]中不能用CX,LAB为标号,非变量;
(4)转向地址应为标号,不能是变量;
(5)目的操作数的类型不确定;
(6)SHL指令中,当所移位数超过1时,必须用CL或CX来取代所移位数。
3.数据定义语句如下所示:
FIRSTDB90H,5FH,6EH,69H;
SECONDDB5DUP(?
);
THIRDDB5DUP(?
)自FIRST单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:
编一段程序将这个数左移两位后存放到自SECOND开始的单元,右移两位后存放到自THIRD开始的单元。
DATASEGMENT;
FIRSTDB90H,5FH,6EH,69H;
DATAENDS;
CODESEGMENT;
ASSUMECS:
CODE,DS:
DATA;
START:
MOVAX,DATA;
MOVDS,AX;
LEASI,FIRST;
LEADI,SECOND;
;
左移2位;
MOVAX,[SI];
AX=5F90H为低十六位数据;
MOVDX,[SI];
DX=696EH为高十六位数据;
PUSHDX;
保存原有的高十六位数据;
PUSHAX;
保存原有的低十六位数据;
ROLDX,CL;
将高位数据不带进位循环左移两位,即高2位数据在DL的低2位;
ANDDL,03H;
让DL中仅保存移出的高2位数据;
MOV[DI+4],DL;
将移出的高2位数据放入SECOND中的最高单元中;
ROLAX,CL;
将低位数据不带进位循环左移两位,即AX的高2位在AL的低2位;
ANDAL,03H;
让AL中仅保存移出的AX高2位数据;
MOVBL,AL;
将AL中的数据放入BL中保存;
POPAX;
弹出原有的低十六位数据;
POPDX;
弹出原有的高十六位数据;
SHLDX,CL;
将高位数据算术逻辑左移2位;
SHLAX,CL;
将低位数据算术逻辑左移2位;
ORDL,BL;
将AX中移出的高2位数据放入DX的低2位;
MOV[DI],AX;
MOV[DI+2],DX;
右移2位;
LEADI,THIRD;
保存原有的高十六位数据PUSHAX;
RORAX,CL;
将低位数据不带进位循环右移两位,即低2位数据在AH的高2位;
ANDAH,0C0H;
让AH中仅保存移出的低2位数据;
PUSHCX;
MOVCX,6;
SHRAH,CL;
POPCX;
MOV[DI],AH;
将移出的低2位数据放入THIRD中的最低单元中;
RORDX,CL;
ANDDH,0C0H;
让DH中仅保存移出的DX低2位数据;
MOVBL,DH;
将DH中的数据放入BL中保存;
SHRDX,CL;
SHRAX,CL;
ORAH,BL;
将DX中移出的低2位数据放入AX的高2位;
MOV[DI+1],AX;
MOV[DI+3],DX;
MOVAH,4CH;
INT21H;
CODEENDS;
ENDSTART;
4.在当前数据区从400H开始的256个单元中存放着一组数据,试编程序将它们顺序搬移到从A000H开始的顺序256个单元中。
ORG400H;
DAT1DB...;
256DUP(?
ORG0A000H;
DAT2DB...;
;
;
STACKSEGMENT;
STACKENDS;
ASSUMEDS:
DATA,CS:
CODE,SS:
STACK,ES:
START:
MOVAX,DATA;
MOVDS,AX;
CH3-14;
LEASI,DAT1LEADI,DAT2;
MOVCX,128;
AGAIN:
MOVAL,[SI];
MOV[DI],AL;
LOOPAGAIN;
CH3-15,将两个数据块逐个单元进行比较,若有错BL=00H,否则BL=FFH;
LEASI,DAT1;
LEADI,DAT2;
NEXT:
MOVBL,[DI];
CMPAL,BL;
JNZERROR;
MOVBL,0FFH;
JMPEXIT;
ERROR:
MOVBL,00H;
EXIT:
MOVAX,4C00H;
ENDSTART
5.试编程序将当前数据区从BUFF开始的4K个单元中均写入55H,并逐个单元读出比较,看写入的与读出的是否一致。
若全对,则将ERR单元置0H;
如果有错,则将ERR单元置FFH。
BUFFDB1000HDUP(?
ERRDB?
ASSUMECS:
CODE,DS:
将55H依次放入BUFF开始的4K个单元;
LEASI,BUFF;
MOVCX,1000HMOVAL,55H;
NTXT:
MOV[SI],AL;
取出与55H比较,全对则ERR=0,否则ERR=FFH;
LEADI,BUFF;
LEASI,ERR;
MOVCX,1000H;
NEXT1:
MOVAL,[DI];
CMPAL,55H;
JNZERROR;
若有一个不同,即置ERR=FFH;
LOOPNEXT1;
MOVAL,00H;
MOV[SI],AL;
全比较完无错,则置ERR=0;
MOVAL,0FFH;
MOV[SI],AL;
返回DOS;
MOVAH,4CH;
END
6.在上题中,如果发现有错时,要求在ERR单元中存放出错的数据个数,则程序该如何修改?
ERRDW?
MOVAL,55H;
取出与55H比较LEADI,BUFF;
MOVDX,0000H;
JZNEXT2;
若相同,则比较下一个;
INCDX;
否则将放出错个数的DX加1;
NEXT2:
LOOPNEXT1;
MOV[SI],DX;
7.试编写程序段,完成将数据区从0100H开始的一串字节数据逐个从F0H端口输出,已知数据串以0AH为结束符。
DATASEGMENT;
ORG0100H;
DATA1DBNDUP(?
将DATA1数据串中的数据取出并从F0H端口中输出;
LEASI,DATA1;
MOVCX,N;
MOVBL,0AH;
JZEXIT;
OUT0F0H,AL;
CODEENDSENDSTART;
8.内存中以FIRST和SECOND开始的单元中分别存放着两个4位用压缩BCD码表示的十进制数,低位在前。
编程序求这两个数的和,仍用压缩BCD码表示,并存到以THIRD开始的单元。
FIRSTDW3412H;
SECONDDW7856H;
THIRDDB?
?
LEASI,FIRST;
LEADI,SECOND;
LEABX,THIRD;
MOVCX,2;
MOVAL,BYTEPTR[SI];
MOVDL,BYTEPTR[DI];
ADCAL,DL;
DAA;
MOVBYTEPTR[BX],AL;
JCAA;
MOVBYTEPTR[BX],0;
AA:
MOVBYTEPTR[BX],1;
9.试编写程序实现将键盘输入的小写字母转换成大写字母并输出。
MESSDB'
THEINPUTISNOTCORRECT.'
0DH,0AH,'
$'
DAT