微机原理及接口第四章习题答案复习课程Word格式.docx
《微机原理及接口第四章习题答案复习课程Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理及接口第四章习题答案复习课程Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
![微机原理及接口第四章习题答案复习课程Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/3/32218d98-53f3-44b8-b9e4-55bbf731bc23/32218d98-53f3-44b8-b9e4-55bbf731bc231.gif)
ORG2000H
A1DD2DUP(7,1,?
)
A2DB10DUP(0,4,3DUP
(2),5)
05H
‘$’
?
9AH
VAR2(0024H)
56H
41H(‘A’)
42H(‘B’)
题4-7图
CNTEQU20H
A3DW100DUP(?
DSEGENDS
请分别用分析运算符SEG、OFFSET、LENGTH、SIZE、TYPE求出
A1、A2、A3的段基址、偏移量、类型及它们的LENGTH、SIZE。
(SEGA1)=0300H,(OFFSETA1)=2000H,(TYPEA1)=4,
(LENGTHA1)=2,(SIZEA1)=2×
4=8;
(SEGA2)=0300H,(OFFSETA2)=2018H,(TYPEA2)=1,
(LENGTHA2)=10,(SIZEA2)=10×
1=60;
(SEGA3)=0300H,(OFFSETA3)=2054H,(TYPEA3)=2,
(LENGTHA3)=100,(SIZEA3)=100×
2=200
6.已知符号定义语句如下:
ALPHAEQU100
BETAEQU25
GAMMAEQU2
分别求下列各表达式的值。
(1)ALPHA*4GTBETA=100*4GT25=0FFFFH
(2)ALPHAMODGAMMA+BETA=100MOD2+25=25
(3)(BETA/3)LE5=(25/3)LE5=0
(4)ALPHAANDBETA=100AND25=64H&
19H=0
(5)GAMMAXOR(BETAEQ25)=2⊕(25EQ25)=0FFFDH
7.已知数据段定义如下:
DSEGSEGMENT
ORG6
ARA1DD110009H
ARA2DW2DUP(?
),‘64’
CONT1EQU$-ARA2
COUT2EQUARA2-ARA1
ARA3DBCONT1DUP(0FFH)
ARA4DB2DUP(?
CONT2DUP(5),’$’)
ORG$+2
VAR2DW569AH
DB‘AB’
DSEGENDS
用示意图说明该数据段的存贮单元分配情况。
有关存储单元的内容如右图所示。
8.下列程序是否有错?
如有错,请改正。
该程序完成什么功能?
。
DATASEGMENT
INBUFDW100DUP(?
OUTBUFDW100DUP(?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
INIT:
MOVSI,OFFSETINBUF
LEADI,OUTBUF
MOVCX,100
REPMOVSB
MAINENDP
CODEENDS
ENDMAIN
改正之后的源程序清单如下(下划波浪线的语句是原来没有的或有错之处):
INBUFDW100DUP(?
OUTBUFDW100DUP(?
DATA,ES:
DATA;
原ASSUME语句未说明ES
PUSHDS;
补充的三条指令为主程序返回提供正确的地址
XORAX,AX
PUSHAX
MOVES,AX;
MOVS指令以ES:
DI为目的串指针,故应对ES赋值
LEADI,OUTBUF
CLD;
从首址开始传送,应使DF=0
REPMOVSW;
应传送的是100个字而非字节
RET;
程序结束,返回DOS
BEGIN:
MOVAX,DATA
MOVES,AX;
需用STOS串操作指令
MOVCX,COUNT
LEASI,BLOCK;
源数据区指针
LEADI,BUFFER;
正数存放区指针
CLD;
自动增量
AGAIN:
LODSB;
取源数据,并修改SI
TESTAL,80H;
取符号位,不影响AL
JSGO;
符号位=1,是负数,不存
STOSB;
存正数并修改DI
GO:
LOOPAGAIN
MOVAH,4CH;
退出循环,返回DOS
INT21H
ENDBEGIN
11.已知有一个长100个字的数据块,存放在以3DA0H:
1000H开始的存储区域内。
试编写一个完整的汇编语言程序,将该数据块复制到以3DA0H:
1008H开始的存储区内。
一种可能的程序如下实现:
DATASEGMENTAT3DA0H
ORG1000H
BLOCKDW104DUP(?
SSEGSEGMENTPARASTACK‘SSEG’
DB100DUP(?
SSEGENDS
CODE,SS:
SSEG,DS:
DATA,ES:
PUSHDS
MOVAX,0
MOVAX,SEGBLOCK
MOVES,AX
MOVCX,200;
重复次数
LEASI,BLOCK
ADDSI,199;
SI=10C7H
MOVDI,SI
ADDDI,8;
DI=10CFH
STD;
自动减量
RET
简析:
由题意可知,源数据区(占用地址3DA0:
1000H~3DA0:
10C7H,共200个字节)与目标数据区(占用地址3DA0:
1008H~3DA0:
10CFH,共200个字节)是重叠的。
若从首址开始增量传送(DF=0),将破坏1008H以后的源数据,所以必须从末址向首址减量传送(DF=1)。
数据段初始化时,有以下几点需注意:
段基址规定为3DA0H,故应在段定义伪指令SEGMENT后加上AT语句;
源数据区首址的偏移量规定为1000H,故应使用ORG语句指明;
对源、目标数据区进行定义时,应注意目标数据区首址的偏移量是1008H。
如果定义为:
ORG1000H
SOURDW100DUP(?
);
源数据区
DESTDW100DUP(?
目标数据区
则目标数据区首址的偏移量实际上是10C8H,不合题意。
可将它们统一定义为足够长度(至少104字或208字节)的变量,如参考程序所示。
指针初始化时,可以将SI、DI分别置为10C7H、10CFH,且CX=200,即进行字节的传送,使用MOVSB;
亦可将SI、DI分别置为10C6H、10CEH,且CX=100,即进行字的传送,相应使用MOVSW。
12.从内存单元BUF开始的缓冲区中有7个8位无符号数,依次为13H、0D8H、92H、2AH、66H、0E0H、3FH。
编程找出它们的中间值并放入RES单元,且将结果以“(RES)=?
”的格式显示在屏幕上。
DATASEGMENT
BUFDB13H,0D8H,92H,2AH,66H,0E0H,3FH
RESDB?
;
中间数的存放单元
STRDB‘(RES)=’
STR1DB?
,?
,‘$’;
结果字符串
DB100DUP(?
MAINPROCFAR;
主程序
有STOS指令,需用ES
MOVCX,6;
外循环次数,比6次
AGN:
MOVSI,OFFSETBUF
MOVDI,SI
INCDI;
SI、DI指向相邻2数
MOVDX,6;
内循环次数,比6次
AGN1:
MOVAL,[SI]
CMPAL,[DI];
两个无符号数相比较
JBUNCH;
小于则转,不互换
EXCH:
XCHGAL,[DI];
前1单元较大,则互换
MOV[SI],AL;
大数放在后面
UNCH:
INCSI;
修改指针,指向下一个数
INCDI
DECDX
JNZAGN1;
未处理完,继续内循环
LOOPAGN;
外循环
DONE:
MOVAL,[SI-3];
排序完成,取中间数
MOVRES,AL
ANDAL,0F0H;
分离高半字节
MOVCL,4
SHRAL,CL
CALLBATR;
调子程序,将AL值转换为ASCII码
LEADI,STR1;
DI指向结果单元
CLD
存放转换结果
MOVAL,RES
ANDAL,0FH;
分离并转换低半字节
CALLBATR
STOSB
LEADX,STR;
显示整个字符串
MOVAH,09H
MAINENDP;
主程序MAIN结束
;
子程序BATR,实现16进制数到ASCII码的转换
BATRPROCNEAR
CMPAL,10;
入口参数为AL
JBNUM;
是数字,则转NUM
ADDAL,’A’-10-’0’;
字母
NUM:
ADDAL,’0’
BATRENDP;
子程序结束
本例的基本思路是:
先把7个无符号数按大小排序,排序完成之后取位于中间的一个数即为中间值。
然后将该16进制数转换为两个对应的ASCII码,再与要求的格式字符一起输出送显即可。
数据排序可以是从大到小、或从小到大排列,本参考程序完成从小到大排序,由一个双重循环结构实现。
内循环完成一个数与其它数之间的一一比较,并使每次比较所得的小数置于低地址单元。
外循环实现所有数之间的两两相较。
共7个数据,故内、外循环中的比较次数均为6次。
编程时需注意:
无符号数比较大小应使用JA、JB、JAE、JBE指令,本例完成从小到大的排列,故用JB控制转移到UNCH;
若要从大到小排列,则用JA代替JB即可。
对两个循环体进行初始化时,需仔细考虑指针和循环控制寄存器的初值。
在数据段的定义中,分别定义STR、STR1两个变量名字,是为了便于在STR1处存放转换结果;
显示时使DX直接指向STR,以STR1末尾的“$”为结束符。
中间值找出之后,应把高、低半字节相分离,并分别转换为各所对应的ASCII码。
13.设某测试系统中,1号端口为测试口,所得数据是0~9之间的十进制整数;
2号端口为显示口,对应于数字0~9的LED七段共阴显示码依次为:
3FH、06H、5BH、4FH、66H、6DH、3DH、07H、7FH、6FH。
编写一段查表送显的程序,要求:
先从测试口读入一个数据,再查表将相应的显示码从显示口送出,如此反复进行直至读入数据“0FFH”为止。
TABDB3FH,06H,5BH,4FH,66H
DB6DH,3DH,07H,7FH,6FH;
0~9的七段码
STACKSEGMENTPARASTACK‘STACK’
DW50DUP(?
STACKENDS
STACK,DS:
START:
LEABX,TAB;
BX指向表首址
NEXT:
INAL,1;
从测试口输入
CMPAL,0FFH
JESTOP;
是0FFH,结束
XLATTAB;
不是0FFH,查表转换
OUT2,AL;
向显示口输出七段码
JMPNEXT;
继续测试
STOP:
MOVAH,4CH
ENDSTART
14.编程实现以下操作:
从键盘输入4个数字,分别作为2个10~99之间的十进制数。
求它们的和,并把结果以三位十进制数的形式显示在屏幕上。
要求:
输入回显的两个加数与送显的和之间有适当的分隔,以示区别。
格式可自行拟定。
NUM1DB?
;
加数1,高位在前,以非组合BCD码存放
NUM2DB?
加数2,高位在前,以非组合BCD码存放
SUMDB?
存放结果的ASCII码,以‘$’为结束符
FIRST:
MOVAX,SEGNUM1
自动增量,先输入高位
MOVCX,2
LEADI,NUM1;
输入加数1
IN1:
MOVAH,1;
DOS功能调用,单字符输入
ASCII码转换为非组合BCD码
LOOPIN1
MOVDL,‘+’;
输出加号,以分隔2个加数
MOVAH,2
LEADI,NUM2;
输入加数2
IN2:
MOVAH,01H
ANDAL,0FH
LOOPIN2
MOVDL,‘=’;
输出等号,分隔加数与结果
MOVAH,02H
LEASI,NUM1
INCSI;
SI指向加数1的低位
LEABX,NUM2
INCBX;
BX指向加数2的低位
LEADI,SUM
ADDDI,2;
DI指向结果的末单元
自动减量,由低向高相加
MOVCX,2;
相加次数
CLC;
清进位,准备用ADC
AD:
取加数1的低位,修改SI
ADCAL,[BX];
2数相加,带进位
AAA;
未组合BCD码的十进制调整
PUSHF
ADDAL,30H;
BCD码向ASCII码转换
POPF
;
因未组合BCD码的高4位为0,故加30H不会影响CF
存和,并修改DI。
CF不变
DECBX;
指向加数2的高位。
LOOPAD
ADCBYTEPTR[DI],30H;
高位相加若产生进位,则使SUM单元加1(表示百位),故使用ADC指令
LEADX,SUM;
输出结果
返回DOS
CODEENDS
ENDFIRST
按照本参考程序,屏幕显示格式如“73+46=119”的样式。
基本思路是:
首先调用DOS功能,从键盘输入2个0~9之间的数字(字符串输入的AH调用号为10,单个字符输入的AH调用号为1),然后向CRT输出“+”(单个字符输出的AH调用号为2);
再由键盘输入2个数,然后输出“=”。
将两次输入的数分别作为2个加数相加,得到的和经十进制调整后,向CRT输出(字符串输出的AH调用号为9)。
以下几处需进行码制转换:
调用单个字符输入功能后,AL中的出口参数为各数字键所对应的ASCII码,故应转换为BCD码才能进行加运算。
转换方式:
与0FH相与,所得为未组合BCD码。
2个未组合BCD码相加,和应该用AAA指令进行十进制调整,调整结果反映在累加器和标志位CF上。
加法完成之后,应将结果逐位转换为ASCII码,才可以向CRT输出。
做加法运算时还应注意:
加数输入之后,先取两个低位相加,再取高位相加(同时加上低位相加产生的进位),需仔细检查指针。
若用循环结构完成加运算,则进入循环之前必须清CF,方可在循环体中使用ADC指令。
15.有一个长度不超过100字节的字符串,以回车符结尾。
编程统计其中非空格的字符个数,并将统计结果以自拟格式显示在CRT上。
STRDB‘It’’safineday,isn’’tit?
’,0DH,‘$’
依题意以0DH为结束符。
加上“$”便于显示整个字符串
COUNTEQU$-STR-2;
串长中不包括结束符和“$”符号
NUMDB0;
置统计结果初值为0
STR1DB‘Thenumberofnon-spacecharactorsis’,‘$’
有SCAS指令,需用ES
LEADI,STR
MOVAL,20H;
关键字符(空格)
SCASB
JESKIP;
是空格,跳过下一句
INCNUM;
非空格字符,NUM加1
SKIP:
LOOPNEXT
显示原字符串
MOVDL,0AH;
显示换行符,以便显示另一字串
LEADX,STR1;
显示另一个字符串
MOVAH,9
将16进制的统计结果转换为十进制数,再转换为两个ASCII码输出
MOVAL,NUM
MOVAH,0;
AX中为待转换16进制数
MOVBL,10
DIVBL;
AX/BL
商(十位)在AL中,余数(个位)在AH中,均为未组合BCD码