微机原理与汇编语言复习资料文档格式.docx
《微机原理与汇编语言复习资料文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理与汇编语言复习资料文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![微机原理与汇编语言复习资料文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/8/9b14e35a-0e59-4a81-8d91-259462b37416/9b14e35a-0e59-4a81-8d91-259462b374161.gif)
基址指针BP;
(4)专用寄存器:
指令指针IP;
FR标志寄存器FR;
(5)段寄存器:
代码段寄存器CS;
数据段寄存器DS;
堆栈段寄存器SS;
附加段寄存ES
15.ALE(地址所存允许信号)输出、三态、高电平有效;
ALE引脚高有效时,表示复用引脚:
AD7~AD0和A19/S6~A16/S3正在传送地址信息;
由于地址信息在这些复用引脚上出现的时间很短暂,所以系统可以利用ALE引脚将地址锁存起来。
16.
1)写出每条汇编指令执行后相关寄存器中的值。
第一空:
F4A3H第二空:
31A3H第三空:
3123H
第四空:
6246H第五空:
826CH第六空:
6246H
第七空:
826CH第八空:
04D8H第九空:
0482H
第十空:
6C82H第十一空:
D882H第十二空:
D888H
第十三空:
D810H第十四空:
(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
解答如下:
movax,2addax,axaddax,axaddax,ax
17.
总线周期
IO/M*
WR*
RD*
存储器读
低
高
存储器写
I/O读
I/O写
总线操作是指CPU通过总线对外的各种操作
8086/8088的总线操作主要有:
存储器读、I/O读操作存储器写、I/O写操作中断响应操作总线请求及响应操作CPU正在进行内部操作、并不进行实际对外操作的空闲状态Ti。
18.
(1)时序:
是指信号高低电平(有效或无效)变化及相互间的时间顺序关系CPU时序决定系统各部件间的同步和定时总线时序描述CPU引脚如何实现总线操作
(2)指令周期:
是指一条指令经取指、译码、读写操作数到执行完成的过程。
若干总线周期组成一个指令周期
(3)总线周期:
是指CPU通过总线操作与外部(存储器或I/O端口)进行一次数据交换的过程
19.存储器的主要性能指标:
存储容量、存取速度、可靠性、性能价格比
20.8088存储器写总线周期时序图(最小模式)
T1状态——输出20位存储器地址A19~A0;
IO/M*——输出低电平,表示存储器操作;
ALE——输出正脉冲,表示复用总线输出地址;
T2状态——输出控制信号WR*和数据D7~D0;
T3和Tw状态——检测数据传送是否能够完成;
T4状态——完成数据传送
21.8088I/O写总线周期
T1状态——输出16位I/O地址A15~A0;
IO/M*输出高电平,表示I/O操作;
ALE输出正脉冲,表示复用总线输出地址;
T2状态——输出控制信号WR*和数据D7~D0;
22、存储器读总线周期
T1状态——输出20位存储器地址A19~A0
IO/M*输出低电平,表示存储器操作;
ALE输出正脉冲,表示复用总线输出地址
T2状态——输出控制信号RD*
T3和Tw状态——检测数据传送是否能够完成
T4状态——前沿读取数据,完成数据传送
23.I/O读总线周期
T1状态——输出16位I/O地址A15~A0;
24.cache-内存层次和内存-外存层次
25.设CS=B000H、DS=1CDEH、SS=4200H、ES=0150H,它们分别为代码段、数据段、堆栈段和附加段的段首址。
自每个段首址开始,各段均占64KB的范围,各段之间互不重叠。
如图所示。
26.设CS=0200H、DS=0400H、SS=0480H,这样代码段、数据段和堆栈段的物理首地址分别为02000H、04000H和04800H。
其中代码段占8KB地址空间,数据段占2KB,堆栈段占256B,SP=0100H。
26.在显示器上显示“Howareyou?
”,然后读一个字符,但不显示此字符,若读入字符是‘y则显示‘ok’。
DSEGSEGMENT
DAT1DB‘Howareyou?
’,0DH,0AH,‘$’
DAT2DB‘OK’,0DH,0AH,‘$'
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVDX,OFFSETDAT1
MOVAH,9
INT21H;
显示提示信息
MOVAH,8
输入字符不回显
CMPAL,‘Y’
JNENEXT
LEADX,DAT2;
显示ok
INT21H
NEXT:
MOVAH,4CH;
返回DOS
CSEGENDS
ENDSTART
27.屏幕显示“PASSWORD?
”,随后从键盘读入字符串,并比较这个字符串与内部设定的字符串,若两者相同,则显示“ok”,否则不作任何显示。
PASS1DB‘12AB’
NEQU$-PASS1
DT1DB“PASSWORD”,0DH,0AH,’$’
PASS2DB20;
最大长度
DB?
;
实际长度
DB20DUP(?
)
DT2DB‘OK$’
CSEG,DS:
DSEG,ES:
START:
MOVES,AX
LEADX,DT1
显示“PASSWORD”
LEADX,PASS2
MOVAH,0AH
等待键盘输入字符串
LEASI,PASS1
LEADI,PASS2
CMPBYTEPTR[DI+1],N;
检查字符个数是否相等
JNELAST
MOVCX,N
LEADI,PASS2+2
CLD
REPZCMPSB;
检查字符是否匹配
JNZLAST;
不匹配,程序结束
DISOK:
LEADX,DT2;
匹配,显示OK
LAST:
MOVAH,4CH
28.编写一个程序,求W=(X2-Y2)/Z,设X、Y、均为一个8位无符号数,运算不考虑溢出。
分析:
表达式改写为W=(X+Y)(X-Y)/Z,因为表达式简单,根据表达式运算次序来编写程序,由于运算不考虑溢出,所以不考虑(X+Y)>256情况。
解:
程序清单如下:
DSEGSEGMENT
DATXDB80;
假定X为80
DATYDB50;
定义Y的值
DATZDB5;
定义Z的值
DATWDB?
定义保存计算结果的存储单元
STEGSEGMENTPARASTACK
DW20HDUP(0)
STEGENDS
DSEG,SS:
STEG
BEGIN:
MOVAX,DSEG
MOVAL,DATX;
取X
ADDAL,DATY;
计算(X+Y)→(AL)
MOVBL,DATX;
SUBBL,DATY;
计算(X-Y)→(BL)
MULBL;
计算(X+Y)×
(X-Y)→(AX)
MOVCL,DATZ;
取Z
DIVCL;
(X-Y)/Z
MOVDATW,AL;
保存结果
MOVAH,4CH;
ENDBEGIN
29.编写一个程序,实现键入任一个字符,显示其十进制的ASCⅡ码(例如:
键入A,显示41H)。
分析:
首先接受一个字符,其ASCⅡ码一定在0~255之间,把二进制的ASCH码转换为十进制后输出即可。
转换的算法是:
用该数除以100,商是二进制的百位;
再把余数除以10,商是二进制的十位;
余数是二进制的个位。
二进制的百位、十位、个位加上30H即为字符的百位、十位、个位,然后输出即可。
CODESEGMENT
CODE
MOVAH,1
读一个按键
MOVAH,0;
准备做AX/100,所以要把AH清0
MOVBL,100;
除法指令不允许用立即数,把除数放在BL中
DIVBL;
除以100
MOVCL,AL;
保存商,即百位数
ADDCL,30H;
把百位数转化成ASCⅡ码
MOVAL,AH;
取除以100的余数到BL中,作下一次的被除数
被除数高位部分清0
MOVBL,10;
准备除数10
除以10
ADDAL,30H;
商是十位数,转换成ASCⅡ码
ADDAH,30H;
把余数个位数转换成ASCⅡ码
MOVBX,AX;
用BX保存转换后的十位和个位数字
MOVAH,2
MOVDL,13
输出回车
MOVDL,10
输出换行符
MOVDL,CL;
输出百位数
MOVDL,BL;
输出十位数
MOVDL,BH;
输出个位数
MOVAH,4CH
CODEENDS
30.以BUF为首地址的内存单元中存有1~15的平方表。
查表求X单元中数(在1~15之间)的平方值,并送回X单元。
表是一种常见的数据结构,平方表是一个数据表,为便于查表,需要组织好表的结构,即表中的平方值按顺序存放。
查表的方法是顺序查表法,以X为索引值,将索引值和平方表的首地址相加,其和作为表内偏移地址,取出相应X的平方值。
NAMEEXAM3
DATASEGMENT
BUFDB1,4,9,16,25,36,49,64
DB81,100,121,144,169,196,255
XDB12
DATAENDS
STACKSEGMENTSTACK’STACK’
DB100DUP(?
STACKENDS
ASSUMECS:
CODE,DS:
DATA,SS:
STACK;
段地址说明
MOVAX,DATA
MOVDS,AX;
数据段地址装填(堆栈段地址由系统装填)
MOVSI,OFFSETBUF;
取BUF的偏移量
XORAX,AX;
AX清0
MOVAL,X;
DECAL
ADDSI,AX;
X平方值的地址
MOVAL,[SI];
取X的平方值
MOVX,AL
31.以BUF为首地址的内存单元中,存放若干个8位的带符号数,统计≥0的数的个数,并将结果存入RESULT字节单元中。
BUFFDB1,-4,90,16,0,36,-49,-68
CNTEQU$-BUFF
RESULTDB?
STACKSEGMENTPARASTACK
ASSUMECS:
LEASI,BUFF;
取BUFF的偏移量
MOVDL,0;
DL清0
MOVCL,CNT;
取符号数的总个数,设置循环次数
LOP1:
MOVAL,[SI]
CMPAL,0;
和0比较
JLLOP2;
小于0时转移
INCDL;
统计大于等于0的个数
LOP2:
INCSI;
修改地址指针
DECCL;
CL减1
JNZLOP1;
CL不为0转移到LOP1
MOVRESULT,DL;
传送统计结果到存储单元
32..设一个字节的二进制数存放在BINNUM单元中。
编写程序将它转换成十六进制数的形式显示在屏幕上。
显示字符用DOS的2号功能调用,要显示的字符的ASCⅡ码必须装入DL中。
因为4位二进制数对应1位十六进制数,一个字节的二进制数对应2位十六进制数。
十六进制数每位代码是0~9和A~F,对应的ASCⅡ码为30H~39H和41H~46H,因此程序中要判断该数的大小,若在0~9范围,加上30H,若在A~F之间,则加上37H。
BINSUMDB10001011B
MOVBL,BINSUM;
取二进制数
开始处理高4位
MOVCL,4;
设置移位次数
SHRDL,CL;
右移4位,取低4位
ADDDL,30H
CMPDL,‘9’;
与39H比较
JBEDONE1;
小于等于39H转移
ADDDL,7;
否则加7,转换为‘A’~‘F’
DONE1:
MOVAH,2;
显示高4位
ANDBL,0FH;
开始处理低4位
MOVDL,BL
CMPDL,3AH;
和‘A’比较
JBLOP2;
小于‘A’时转移
MOVAH,2;
显示低4位
33.编写一个汇编程序,求1~100的累加和。
程序功能简单,循环次数已经确定为100次,可以采用循环结构实现它。
MOVAX,0
MOVCX,100;
设置循环次数
ADDAX,CX;
求累加和
LOOPLOP1;
CX减1不为0,则转移
34.设VARY中有一组8位的符号数,编程统计其中的正数、负数、零的个数,分别存入VM、VN、VK变量中。
数组VARY中的数据个数用CNTEQU$-VARY求出,则循环次数为CNT次。
将数组VARY中的数据逐个与0比较,利用PSW(标志寄存器)中的ZF求出零的个数,利用SF求出正、负数的个数。
参考程序如下:
STACKENDS·
VARYDB23H,78H,0ABH,0CDH,00H,56H
DB14H,86H,0EFH,0BCH,00H,0C0H
CNTEQU$-VARY
VMDB?
VNDB?
VKDB?
STACK
MOVBX,0;
初始化
清0
LEASI,VARY;
初始化地址指针
MOVCX,CNT;
;
循环体
CMPBYTEPTR[SI],0;
JEZERO;
等于0转ZERO
JSLOP2;
为负数转LOP2
INCBH;
统计正数个数的寄存器增1
JMPNEXT
INCBL;
统计负数个数的寄存器增1
ZERO:
统计0个数的寄存器增1
NEXT:
INCSI;
判断终止条件,CX-1≠0则循环
结束处理部分
MOVVM,BH;
保存正数的个数
MOVVN,BL;
保存负数的个数
MOVVK,DL;
保存0的个数
35.编写程序,实现在同一行上依次显示26个大写字母.
MOVCX,26;
MOVDL,‘A’;
要显示的字符的ASCⅡ码必须装入DL中
显示字符用DOS的2号功能调用
循环修改部分
36.编写程序,实现键入任意一个字符,显示其ASCⅡ码中含“1”的个数。
计数器清0
MOVAH,1;
等待键入一个字符,键入的字符存放在AL中
CMPAL,0;
与0比较
JEEXIT;
是0则转移到EXIT
SHLAL,1;
左移1位
ADCDL,0;
统计1的个数
JMPLOP1
EXIT:
ADDDL,30H;
二进制转换成ASCⅡ码
显示字符键入字符中含“1”的个数
37.编写程序,将带符号的字节数组ARRY中最大数找出来,送到MAX单元中。
在字节数组中找出最大数,可以把第1个数送AL中,让AL与第2个数及它后面的每一个数进行比较,每次比较时将大者放AL中,最后把AL的值送MAX单元即可。
ARRYDB23H,78H,0ABH,0CDH,00H,56H
DB14H,86H,0EFH,0BCH,100H,0C0H
CNTEQU$-ARRY;
字节个数
MAXDB?
MOVAX,DATA
LEASI,ARRY;
MOVCX,CNT-1;
MOVAL,[SI]
地址指针增1
CMPAL,[SI];
与下一个数比较
JGELOP2;
大于等于时转LOP2
取较大的数放AL寄存器中
LOOPLOP1;
MOVMAX,AL;
保存最大数
38.以BUF为首地址的内存单元中,存放若干个8位的带符号数,统计≥0的数的个数,并将结果存入RESULT字节单元中。
DECC