微机原理及接口第四章习题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

“微机系统原理与接口技术”第四章习题解答
1.判断以下说法是否正确,如有错,请说明原因并改正。

(1)伪指令在汇编过程中不会产生二进制代码。

(2)宏和过程的相同之处是都可用于简化源程序书写、精简目标代码。

(3)在计算机中,高级语言通常需要转换为汇编语言后才能执行。

(4)汇编语言程序上机一般包括编辑、汇编、链接和调试几个步骤。

答:(1)正确。

(2)错误。

宏不能精简目标代码。

(3)错误。

高级语言程序经编译或解释后直接转换为目标代码。

(4)正确。

2.已知数据和符号定义
A1 DB ?
A2 DB 8
K1 EQU 100
判断下列指令的正误,并说明错误指令的原因。

(1)MOV K1,AX
(2)MOV A2,AH
(3)MOV BX,K1
MOV [BX],DX
(4)CMP A1,A2
(5)K1 EQU 200
答:(1)错误。

K1是符号常数,在此处相当于立即数100,故不能做目的操作数。

(2)正确。

(3)正确。

(4)错误。

A1、A2都是字节变量,相当于两个存储器单元,故不能同时出现在一条指令中直接进行比较。

(5)错误。

用EQU定义的符号不能重新赋值,除非已用PURGE解除了原值。

3.若数据段中有定义
NUM1 EQU 23H
NUM2 DW 0
则指令MOV NUM2,NUM1 的源、目操作数的寻址方式以及指令执行后NUM2+1单元的内容分别是什么?
答:指令MOV NUM2,NUM1的源操作数使用立即数寻址,目的操作数使用直接寻址。

指令执行后NUM2+1单元的内容是0。

4.设DS=6000H,BX=8432H,SS=5000H,SP=3258H,内存69632H~69635H单元的内容依次是00H、11H、22H、33H。

4字节指令CALL DWORD PTR [BX+1200H] 本身位于2000H:3250H处的双字单元中。

当8086执行该指令后转移至子程序入口时,CS、IP、SS、SP各寄存器以及栈顶2个字单元的内容分别是多少?
答:执行结果为CS=3322H,IP=1100H,SS=5000H,SP=3254H,栈顶的两个字即
断点地址,为2000H:3254H。

5.已知某数据段从物理地址03000H处开始,定义如下:
DSEG SEGMENT
ORG 2000H
A1 DD 2 DUP(7,1,?)
A2 DB 10 DUP(0,4,3 DUP(2),5)
CNT EQU 20H Array A3 DW 100 DUP(?)
DSEG ENDS
请分别用分析运算符SEG、OFFSET、LENGTH、SIZE、TYPE求出
A1、A2、A3的段基址、偏移量、类型及它们的LENGTH、SIZE。

答:(SEG A1)=0300H,(OFFSET A1)=2000H,(TYPE A1)=4,
(LENGTH A1)=2,(SIZE A1)=2×4=8;
(SEG A2)=0300H,(OFFSET A2)=2018H,(TYPE A2)=1,
(LENGTH A2)=10,(SIZE A2)=10×1=60;
(SEG A3)=0300H,(OFFSET A3)=2054H,(TYPE A3)=2,
(LENGTH A3)=100,(SIZE A3)=100×2=200
6.已知符号定义语句如下:
ALPHA EQU 100
BETA EQU 25
GAMMA EQU 2
分别求下列各表达式的值。

(1)ALPHA*4 GT BETA= 100*4 GT 25 = 0FFFFH
(2)ALPHA MOD GAMMA+BETA= 100 MOD 2+25 = 25
(3)(BETA / 3)LE 5 =(25 / 3)LE 5 = 0
(4)ALPHA AND BETA= 100 AND 25 = 64H & 19H = 0
(5)GAMMA XOR(BETA EQ 25)= 2 (25 EQ 25) = 0FFFDH
7.已知数据段定义如下:
DSEG SEGMENT
ORG 6
ARA1 DD 110009H
ARA2 DW 2 DUP(?),‘64’
CONT1 EQU $-ARA2
COUT2 EQU ARA2 -ARA1
ARA3 DB CONT1 DUP(0FFH)
ARA4 DB 2 DUP (?, CONT2 DUP (5), ’$’ )
ORG $+2
V AR2 DW 569AH
DB ‘AB’
DSEG ENDS
用示意图说明该数据段的存贮单元分配情况。

题4-7 图
答:有关存储单元的内容如右图所示。

8.下列程序是否有错?如有错,请改正。

该程序完成什么功能?。

DA TA SEGMENT
INBUF DW 100 DUP(?)
OUTBUF DW 100 DUP(?)
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA
MAIN PROC FAR
MOV AX,DA TA
MOV DS,AX
INIT:MOV SI,OFFSET INBUF
LEA DI,OUTBUF
MOV CX,100
REP MOVSB
MAIN ENDP
CODE ENDS
END MAIN
答:改正之后的源程序清单如下(下划波浪线的语句是原来没有的或有错之处):DATA SEGMENT
INBUF DW 100 DUP(?)
OUTBUF DW 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA ;原ASSUME语句未说明ES MAIN PROC FAR
PUSH DS ; 补充的三条指令为主程序返回提供正确的地址
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX ; MOVS指令以ES:DI为目的串指针,故应对ES赋值INIT:MOV SI,OFFSET INBUF
LEA DI,OUTBUF
MOV CX,100
CLD ; 从首址开始传送,应使D F=0
REP MOVSW ; 应传送的是100个字而非字节
RET; 程序结束,返回DOS
MAIN ENDP
CODE ENDS
END MAIN
该程序完成的功能是:将INBUF表内的10个字数据复制到以OUTPUT开始的连续的内存单元中。

9.读下面程序,在其中的空处添上适当内容。

该程序完成了什么功能?程序运行后,变量RS的值是多少?
DA TA SEGMENT
BUF DB -13,24,5,-62,77,20,-7,145,0
CNT DB $ -BUF
RS DB 0
DA TA ENDS
STACK SEGMENT PARA STACK‘STACK’
DB 256 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME DS:DA TA,SS:STACK,CS:CODE
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DA TA
MOV DS,AX
LEA BX,BUF
MOV CH,0
MOV CL,
LP:MOV AL,[BX]
TEST AL,80H
JE CONT
INC RS
CONT:INC BX
LOOP LP
RET
START ENDP
CODE ENDS
END START
答:程序空处可填CNT,字节变量RS的最后结果是04H。

该程序实现的功能是:统计数据段中以BUF为首址的带符号字节数据表中负数的个数,CNT为表中所有数据的个数,即表的长度。

需要注意的是:十进制数据“145”在以二进制带符号字节数据形式存放时相当于“-111”。

10.编写一个完整的源程序,将数据35、-27、-13、6、-47、52、9、-3中的正数放入以BUFFER为首址的数据缓冲区中。

答:一种可能的程序如下实现:
DATA SEGMENT
BLOCK DB 35,-27,-13,6,-47,52,9,-3
COUNT EQU $-BLOCK
BUFFER DB COUNT DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK‘STACK’
DW 40 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
BEGIN:MOV AX,DATA
MOV DS,AX
MOV ES,AX ;需用STOS串操作指令
MOV CX,COUNT
LEA SI,BLOCK ;源数据区指针
LEA DI,BUFFER ;正数存放区指针
CLD ;自动增量
AGAIN:LODSB ;取源数据,并修改SI
TEST AL,80H ;取符号位,不影响AL
JS GO ;符号位=1,是负数,不存
STOSB ;存正数并修改DI
GO:LOOP AGAIN
MOV AH,4CH ;退出循环,返回DOS
INT 21H
CODE ENDS
END BEGIN
11.已知有一个长100个字的数据块,存放在以3DA0H:1000H开始的存储区域内。

试编写一个完整的汇编语言程序,将该数据块复制到以3DA0H:1008H开始的存储区内。

答:一种可能的程序如下实现:
DATA SEGMENT AT 3DA0H
ORG 1000H
BLOCK DW 104 DUP(?)
DATA ENDS
SSEG SEGMENT PARA STACK‘SSEG’
DB 100 DUP(?)
SSEG ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:SSEG,DS:DATA,ES:DATA
MAIN PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,SEG BLOCK
MOV DS,AX
MOV ES,AX
MOV CX,200 ;重复次数
LEA SI,BLOCK
ADD SI,199 ;SI=10C7H
MOV DI,SI
ADD DI,8 ;DI=10CFH
STD ;自动减量
REP MOVSB
RET
MAIN ENDP
CODE ENDS
END MAIN
简析:
由题意可知,源数据区(占用地址3DA0:1000H~3DA0:10C7H,共200个字节)与目标数据区(占用地址3DA0:1008H~3DA0:10CFH,共200个字节)是重叠的。

若从首址开始增量传送(D F=0),将破坏1008H以后的源数据,所以必须从末址向首址减量传送(D F=1)。

数据段初始化时,有以下几点需注意:段基址规定为3DA0H,故应在段定义伪指令SEGMENT后加上A T语句;源数据区首址的偏移量规定为1000H,故应使用ORG 语句指明;对源、目标数据区进行定义时,应注意目标数据区首址的偏移量是1008H。

如果定义为:
ORG 1000H
SOUR DW 100 DUP(?);源数据区
DEST DW 100 DUP(?);目标数据区
则目标数据区首址的偏移量实际上是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) = ?”的格式显示在屏幕上。

答:一种可能的程序如下实现:
DATA SEGMENT
BUF DB 13H,0D8H,92H,2AH,66H,0E0H,3FH
RES DB ?;中间数的存放单元
STR DB ‘(RES)=’
STR1 DB ?,?,‘$’;结果字符串
DATA ENDS
SSEG SEGMENT PARA STACK‘SSEG’
DB 100 DUP(?)
SSEG ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:SSEG,DS:DATA,ES:DATA
MAIN PROC FAR ;主程序
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX ;有STOS指令,需用ES
MOV CX,6 ;外循环次数,比6次
AGN:MOV SI,OFFSET BUF
MOV DI,SI
INC DI ;SI、DI指向相邻2数
MOV DX,6 ;内循环次数,比6次
AGN1:MOV AL,[SI]
CMP AL,[DI] ;两个无符号数相比较
JB UNCH ;小于则转,不互换
EXCH:XCHG AL,[ DI ] ;前1单元较大,则互换
MOV [ SI ],AL ;大数放在后面
UNCH:INC SI ;修改指针,指向下一个数
INC DI
DEC DX
JNZ AGN1 ;未处理完,继续内循环
LOOP AGN ;外循环
DONE:MOV AL,[SI-3] ;排序完成,取中间数
MOV RES,AL
AND AL,0F0H ;分离高半字节
MOV CL,4
SHR AL,CL
CALL BATR ;调子程序,将AL值转换为ASCII码
LEA DI,STR1 ;DI指向结果单元
CLD
STOSB ;存放转换结果
MOV AL,RES
AND AL,0FH ;分离并转换低半字节
CALL BATR
STOSB
LEA DX,STR ;显示整个字符串
MOV AH,09H
INT 21H
RET
MAIN ENDP ;主程序MAIN结束
;子程序BATR,实现16进制数到ASCII码的转换
BATR PROC NEAR
CMP AL,10 ;入口参数为AL
JB NUM ;是数字,则转NUM
ADD AL,’A’-10-’0’;字母
NUM:ADD AL,’0’
RET
BATR ENDP ;子程序结束
CODE ENDS
END MAIN
简析:
本例的基本思路是:先把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”为止。

答:一种可能的程序如下实现:
DATA SEGMENT
TAB DB 3FH,06H,5BH,4FH,66H
DB 6DH,3DH,07H,7FH,6FH ;0~9的七段码
DATA ENDS
STACK SEGMENT PARA STACK‘STACK’
DW 50 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA BX,TAB ;BX指向表首址
NEXT:IN AL,1 ;从测试口输入
CMP AL,0FFH
JE STOP ;是0FFH,结束
XLAT TAB ;不是0FFH,查表转换
OUT 2,AL ;向显示口输出七段码
JMP NEXT ;继续测试
STOP:MOV AH,4CH
INT 21H
CODE ENDS
END START
14.编程实现以下操作:从键盘输入4个数字,分别作为2个10~99之间的十进制数。

求它们的和,并把结果以三位十进制数的形式显示在屏幕上。

要求:输入回显的两个加数与送显的和之间有适当的分隔,以示区别。

格式可自行拟定。

答:一种可能的程序如下实现:
DATA SEGMENT
NUM1 DB ?,?;加数1,高位在前,以非组合BCD码存放
NUM2 DB ?,?;加数2,高位在前,以非组合BCD码存放
SUM DB ?,?,?,‘$’;存放结果的ASCII码,以‘$’为结束符
DATA ENDS
STACK SEGMENT PARA STACK‘STACK’
DW 50 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA
FIRST:MOV AX,SEG NUM1
MOV DS,AX
MOV ES,AX ;有STOS指令,需用ES
CLD ;自动增量,先输入高位
MOV CX,2
LEA DI,NUM1 ;输入加数1
IN1:MOV AH,1 ;DOS功能调用,单字符输入
INT 21H
AND AL,0FH ;ASCII码转换为非组合BCD码
STOSB
LOOP IN1
MOV DL,‘+’;输出加号,以分隔2个加数
MOV AH,2
INT 21H
MOV CX,2
LEA DI,NUM2 ;输入加数2
IN2:MOV AH,01H
INT 21H
AND AL,0FH
STOSB
LOOP IN2
MOV DL,‘=’;输出等号,分隔加数与结果
MOV AH,02H
INT 21H
LEA SI,NUM1
INC SI ;SI指向加数1的低位
LEA BX,NUM2
INC BX ;BX指向加数2的低位
LEA DI,SUM
ADD DI,2 ;DI指向结果的末单元
STD ;自动减量,由低向高相加
MOV CX,2 ;相加次数
CLC ;清进位,准备用ADC
AD:LODSB ;取加数1的低位,修改SI
ADC AL,[BX] ;2数相加,带进位
AAA ;未组合BCD码的十进制调整
PUSHF
ADD AL,30H ;BCD码向ASCII码转换
POPF
;因未组合BCD码的高4位为0,故加30H不会影响C F
STOSB ;存和,并修改DI。

C F不变
DEC BX ;指向加数2的高位。

C F不变
LOOP AD
ADC BYT E PTR [DI],30H ;BCD码向ASCII码转换
;高位相加若产生进位,则使SUM单元加1(表示百位),故使用ADC指令
LEA DX,SUM ;输出结果
MOV AH,09H
INT 21H
MOV AH,4CH ;返回DOS
INT 21H
CODE ENDS
END FIRST
简析:
按照本参考程序,屏幕显示格式如“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指令进行十进制调整,调整结果反映在累加器和标志位C F上。

加法完成之后,应将结果逐位转换为ASCII码,才可以向CRT输出。

做加法运算时还应注意:加数输入之后,先取两个低位相加,再取高位相加(同时加上低位相加产生的进位),需仔细检查指针。

若用循环结构完成加运算,则进入循环之前必须清C F,方可在循环体中使用ADC指令。

15.有一个长度不超过100字节的字符串,以回车符结尾。

编程统计其中非空格的字符个数,并将统计结果以自拟格式显示在CRT上。

答:一种可能的程序如下实现:
DATA SEGMENT
STR DB ‘It’’s a fine day, isn’’t it?’,0DH,‘$’
;依题意以0DH为结束符。

加上“$”便于显示整个字符串
COUNT EQU $-STR-2 ;串长中不包括结束符和“$”符号NUM DB 0 ;置统计结果初值为0
STR1 DB ‘The number of non-space charactors is’,‘$’
DATA ENDS
STACK SEGMENT PARA STACK‘STACK’
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA START:MOV AX,DATA
MOV DS,AX
MOV ES,AX ;有SCAS指令,需用ES
LEA DI,STR
CLD
MOV AL,20H ;关键字符(空格)
MOV CX,COUNT
NEXT:SCASB
JE SKIP ;是空格,跳过下一句
INC NUM ;非空格字符,NUM加1
SKIP:LOOP NEXT
LEA DX,STR ;显示原字符串
MOV AH,09H
INT 21H
MOV DL,0AH ;显示换行符,以便显示另一字串
MOV AH,2
INT 21H
LEA DX,STR1 ;显示另一个字符串
MOV AH,9
INT 21H
;将16进制的统计结果转换为十进制数,再转换为两个ASCII码输出
MOV AL,NUM
MOV AH,0 ;AX中为待转换16进制数
MOV BL,10
DIV BL ;AX / BL
;商(十位)在AL中,余数(个位)在AH中,均为未组合BCD码
PUSH AX ;入栈保护
OR AL,30H ;将十位数转换为ASCII码
MOV DL,AL ;送CRT显示
MOV AH,2
INT 21H
POP AX ;恢复除法运算的结果
ADD AH,30H ;将个位数转换为ASCII码
MOV DL,AH ;显示
MOV AH,2
INT 21H
MOV AH,4CH ;完成,返回DOS
INT 21H
CODE ENDS
END START
简析:
本例的关键在于统计结果的显示。

统计完成后,结果单元中是一个16进制数。

为符合一般习惯,应在CRT上显示十进制数,因此首先用除法将十位、个位分离开,再将其分别转换为ASCII码输出。

由于除数是10,故相除之后得到的商(十位数)和余数(个位数)必在0~9范围内,即未组合BCD码,所以很容易转换为ASCII码。

编程时注意:DIV指令执行后结果在AX中,而DOS功能调用必须用AH为调用号,故应保护AX的内容。

另外,原题已告知字串的结束符是0DH,故亦可通过检索结束符(0DH)的方式控制循环。

另外请注意:数据段中定义的STR串中出现的单引号前必须用另一个单引号转义,如“’s”应为“’’s”。

16.数据段中有1个由小写英文字母组成的字符串,编程将各小写字母转换成对应的大写字母,并存放起来。

答:一种可能的程序如下实现:
DSEG SEGMENT
STR1 DB ‘djdwpneasmv’,‘$’
COUNT EQU $-STR1-1
CHAR DB 0AH,0DH
STR2 DB COUNT DUP(?),‘$’
DSEG ENDS
SSEG SEGMENT PARA STACK‘SSEG’
DW 100 DUP(?)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,SS:SSEG,DS:DSEG,ES:DSEG
TRAN PROC FAR
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSEG
MOV DS,AX
MOV ES,AX ;有STOS指令,需用ES
LEA DX,STR1 ;显示小写字母串
MOV AH,9
INT 21H
CLD ;自动增量
LEA SI,STR1 ;SI指向小写字母串
LEA DI,STR2 ;DI指向结果存放处
MOV CX,COUNT;转换次数
NEXT:LODSB ;取1个小写字母至AL中SUB AL,‘a’;转换为大写字母
ADD AL,‘A’
STOSB ;存放
LOOP NEXT
MOV DX,OFFSET CHAR ;换行显示大写字母串
MOV AH,9
INT 21H
RET
TRAN ENDP
CSEG ENDS
END TRAN。

相关文档
最新文档