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

更新时间:2024-01-13 21:04:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

“微机系统原理与接口技术”第四章习题解答

1. 判断以下说法是否正确,如有错,请说明原因并改正。

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

(2)宏和过程的相同之处是都可用于简化源程序书写、精简目标代码。 (3)在计算机中,高级语言通常需要转换为汇编语言后才能执行。 (4)汇编语言程序上机一般包括编辑、汇编、链接和调试几个步骤。 答:(1)正确。

(2)错误。宏不能精简目标代码。

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

(4)正确。

2. 已知数据和符号定义

A1 DB

A2 DB 8 K1 EQU 100

判断下列指令的正误,并说明错误指令的原因。

(1)MOV (2)MOV (3)MOV

MOV (4)CMP (5)K1

K1,AX A2,AH BX,K1 [BX],DX A1,A2 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 A3

EQU DW

20H

100 DUP(?)

?? 09H 00H 11H 00H ? ? ? ? ‘4’ ‘6’ 0FFH ARA1(0006H) ARA2(000AH) ARA3(0010H) ARA4(0016H) VAR2(0024H) 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 ARA1 ARA2

6 DD DW

110009H

2 DUP(?),‘64’ $-ARA2

ARA2 -ARA1

CONT1 DUP(0FFH)

2 DUP (?, CONT2 DUP (5), ’$’ ) 569AH

0FFH 0FFH 0FFH 0FFH 0FFH ? 05H 05H 05H 05H ‘$’ ? 05H 05H 05H 05H ‘$’ 9AH 56H 41H(‘A’) CONT1 EQU COUT2 EQU ARA3 DB ARA4 DB ORG VAR2

$+2 DW

DB ‘AB’ DSEG ENDS

用示意图说明该数据段的存贮单元分配情况。

42H(‘B’) 题 4-7 图

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

8. 下列程序是否有错?如有错,请改正。该程序完成什么功能?。

DATA SEGMENT INBUF DW 100 DUP(?)

OUTBUF

ENDS

DW 100 DUP(?)

DATA

CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC MOV

MOV

INIT: MOV LEA

MOV REP

FAR

AX,DATA DS,AX

SI,OFFSET INBUF DI,OUTBUF CX,100 MOVSB

MAIN ENDP CODE ENDS END MAIN

答:改正之后的源程序清单如下(下划波浪线的语句是原来没有的或有错之处):

DATA

DATA CODE

MAIN

SEGMENT INBUF ENDS SEGMENT

ASSUME CS:CODE,DS:DATA, ES:DATA ;原ASSUME语句未说明ES PROC PUSH XOR PUSH MOV MOV MOV MOV LEA MOV CLD RET ENDP ENDS END MAIN

FAR DS AX,AX AX AX,DATA DS,AX ES,AX DI,OUTBUF CX,100

; 从首址开始传送,应使DF=0 ; 应传送的是100个字而非字节 ; 程序结束,返回DOS

; MOVS指令以ES:DI为目的串指针,故应对ES赋值

SI,OFFSET INBUF

; 补充的三条指令为主程序返回提供正确的地址

DW 100 DUP(?) DW 100 DUP(?)

OUTBUF

INIT:

REP MOVSW MAIN CODE

该程序完成的功能是:将INBUF表内的10个字数据复制到以OUTPUT开始的连续的内存单元中。

9. 读下面程序,在其中的空处添上适当内容。该程序完成了什么功能?程序运行后,变量RS的值是多少?

DATA

SEGMENT

BUF DB CNT RS

DB DB

0

-13,24,5,-62,77,20,-7,145,0

$ -BUF

DATA ENDS

STACK SEGMENT PARA STACK‘STACK’

DB

256 DUP(?)

STACK CODE START

ENDS

SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE PROC FAR PUSH MOV PUSH MOV MOV LEA MOV MOV MOV TEST JE

DS AX,0 AX

AX,DATA DS,AX BX,BUF CH,0 CL, AL,[BX] AL,80H CONT RS BX LP

LP:

INC CONT:INC LOOP 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

35,-27,-13,6,-47,52,9,-3 $-BLOCK

COUNT DUP(?)

BLOCK DB COUNT EQU BUFFER DB

DATA STACK

STACK CODE

ENDS

SEGMENT PARA STACK‘STACK’ DW ENDS SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

AX,DATA DS,AX ES,AX CX,COUNT SI,BLOCK

;源数据区指针 ;正数存放区指针 ;自动增量

;取源数据,并修改SI ;取符号位,不影响AL ;符号位=1,是负数,不存 ;存正数并修改DI ;退出循环,返回DOS

DI,BUFFER

;需用STOS串操作指令

MOV MOV MOV LEA LEA CLD TEST JS

STOSB LOOP MOV INT ENDS END BEGIN

40 DUP(?)

BEGIN: MOV

AGAIN: LODSB

AL,80H GO

AGAIN AH,4CH 21H

GO:

CODE

11. 已知有一个长100个字的数据块,存放在以3DA0H:1000H开始的存储区域内。试编写一个完整的汇编语言程序,将该数据块复制到以3DA0H:1008H开始的存储区内。

答:一种可能的程序如下实现:

DATA

SEGMENT AT 3DA0H ORG 1000H

104 DUP(?)

ENDS

SEGMENT PARA STACK‘SSEG’ DB ENDS SEGMENT

ASSUME CS:CODE,SS:SSEG,DS:DATA,ES:DATA PROC PUSH MOV PUSH MOV MOV MOV MOV LEA

FAR DS AX,0 AX

AX,SEG BLOCK DS,AX ES,AX CX,200 SI,BLOCK

;重复次数

100 DUP(?)

BLOCK DW DATA SSEG

SSEG CODE

MAIN

ADD MOV ADD STD REP RET ENDP ENDS

SI,199 DI,SI DI,8

MOVSB

;SI=10C7H ;DI=10CFH ;自动减量

MAIN CODE

END MAIN

简析:

由题意可知,源数据区(占用地址3DA0:1000H~3DA0:10C7H,共200个字节)与目标数据区(占用地址3DA0:1008H~3DA0:10CFH,共200个字节)是重叠的。若从首址开始增量传送(DF=0),将破坏1008H以后的源数据,所以必须从末址向首址减量传送(DF=1)。 数据段初始化时,有以下几点需注意:段基址规定为3DA0H,故应在段定义伪指令SEGMENT后加上AT语句;源数据区首址的偏移量规定为1000H,故应使用ORG语句指明;对源、目标数据区进行定义时,应注意目标数据区首址的偏移量是1008H。如果定义为:

ORG 1000H

SOUR DEST

DW DW

100 DUP(?) 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

BUF RES STR STR1 DATA SSEG

SSEG CODE

MAIN

SEGMENT DB DB DB ENDS

SEGMENT PARA STACK‘SSEG’ DB ENDS SEGMENT

ASSUME CS:CODE,SS:SSEG,DS:DATA,ES:DATA PROC PUSH

FAR DS

;主程序

100 DUP(?)

13H,0D8H,92H,2AH,66H,0E0H,3FH ?

;中间数的存放单元

DB ‘(RES)=’

?,?,‘$’

;结果字符串

XOR PUSH MOV MOV MOV MOV MOV MOV INC MOV CMP JB

AX,AX AX AX,DATA DS,AX ES,AX CX,6 DI,SI DI

DX,6 AL,[SI] AL,[DI] UNCH

AL,[ DI ] [ SI ],AL SI DI DX AGN1 AGN RES,AL AL,0F0H CL,4 AL,CL BATR

;调子程序,将AL值转换为ASCII码 ;DI指向结果单元 ;存放转换结果 ;分离并转换低半字节

DI,STR1

;分离高半字节

;未处理完,继续内循环 ;外循环

;排序完成,取中间数

;两个无符号数相比较 ;小于则转,不互换 ;前1单元较大,则互换 ;大数放在后面

;修改指针,指向下一个数

;有STOS指令,需用ES ;外循环次数,比6次

;SI、DI指向相邻2数 ;内循环次数,比6次

AGN: SI,OFFSET BUF

AGN1: MOV

EXCH: XCHG

MOV INC DEC JNZ LOOP MOV AND MOV SHR CALL LEA CLD STOSB MOV AND CALL STOSB LEA MOV INT RET ENDP PROC CMP JB

ADD

UNCH: INC

DONE: MOV AL,[SI-3]

AL,RES AL,0FH BATR DX,STR AH,09H 21H

;主程序MAIN结束

;显示整个字符串

MAIN BATR

;子程序BATR,实现16进制数到ASCII码的转换

NEAR AL,10 NUM AL,’0’

;入口参数为AL ;是数字,则转NUM ;字母

AL,’A’-10-’0’

NUM: ADD

RET ENDP ENDS END MAIN

;子程序结束

BATR CODE

简析:

本例的基本思路是:先把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

TAB DATA STACK

STACK CODE

SEGMENT DB DB ENDS

SEGMENT PARA STACK‘STACK’ DW ENDS SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA

AX,DATA DS,AX BX,TAB AL,1 STOP TAB 2,AL NEXT

AL,0FFH

;是0FFH,结束 ;不是0FFH,查表转换 ;向显示口输出七段码 ;继续测试

;BX指向表首址

;从测试口输入

MOV LEA

CMP JE XLAT OUT JMP

50

DUP(?)

3FH,06H,5BH,4FH,66H 6DH,3DH,07H,7FH,6FH

;0~9的七段码

START: MOV

NEXT: IN

STOP: MOV AH,4CH

INT ENDS

21H

CODE

END START

14. 编程实现以下操作:从键盘输入4个数字,分别作为2个10~99之间的十进制数。求它们的和,并把结果以三位十进制数的形式显示在屏幕上。要求:输入回显的两个加数与送显的和之间有适当的分隔,以示区别。格式可自行拟定。

答:一种可能的程序如下实现:

DATA

NUM1 NUM2 SUM DATA STACK

STACK CODE

SEGMENT DB DB DB ENDS

SEGMENT PARA STACK‘STACK’ DW ENDS SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA

AX,SEG NUM1 DS,AX ES,AX

CX,2 DI,NUM1 AH,1 21H AL,0FH IN1 DL,‘+’ AH,2 21H CX,2 DI,NUM2 AH,01H 21H AL,0FH IN2 DL,‘=’ AH,02H 21H SI,NUM1 SI

;SI指向加数1的低位

;输出等号,分隔加数与结果

;输入加数2

;输出加号,以分隔2个加数

;ASCII码转换为非组合BCD码

;输入加数1

;DOS功能调用,单字符输入

;有STOS指令,需用ES ;自动增量,先输入高位

MOV MOV CLD MOV LEA MOV INT AND STOSB LOOP MOV MOV INT MOV LEA MOV INT AND STOSB LOOP MOV MOV INT LEA INC

50 DUP(?) ?,? ?,?

;加数1,高位在前,以非组合BCD码存放 ;加数2,高位在前,以非组合BCD码存放 ;存放结果的ASCII码,以‘$’为结束符

?,?,?,‘$’

FIRST: MOV

IN1:

IN2:

LEA INC LEA ADD STD MOV CLC LODSB ADC AAA PUSHF ADD POPF

BX,NUM2 BX DI,SUM DI,2

CX,2

;DI指向结果的末单元 ;自动减量,由低向高相加 ;相加次数

;清进位,准备用ADC ;取加数1的低位,修改SI ;2数相加,带进位

;未组合BCD码的十进制调整 ;BCD码向ASCII码转换

;BX指向加数2的低位

AD:

AL,[BX]

AL,30H

;因未组合BCD码的高4位为0,故加30H不会影响CF

STOSB DEC LOOP ADC LEA MOV INT MOV INT ENDS END FIRST

AD

BYTE PTR [DI],30H DX,SUM AH,09H 21H AH,4CH 21H

;返回DOS

;BCD码向ASCII码转换 ;输出结果

;存和,并修改DI。CF不变 ;指向加数2的高位。CF不变

BX

;高位相加若产生进位,则使SUM单元加1(表示百位),故使用ADC指令

CODE

简析:

按照本参考程序,屏幕显示格式如“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上。

答:一种可能的程序如下实现:

DATA

STR

SEGMENT

DB ‘It’’s a fine day, isn’’t it?’,0DH,‘$’

$-STR-2 0

;串长中不包括结束符和“$”符号 ;置统计结果初值为0

;依题意以0DH为结束符。加上“$”便于显示整个字符串 COUNT EQU NUM STR1 DATA STACK

STACK CODE

DB ENDS

SEGMENT PARA STACK‘STACK’ DB ENDS SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA

AX,DATA DS,AX ES,AX DI,STR AL,20H CX,COUNT SKIP NUM NEXT DX,STR AH,09H 21H DL,0AH AH,2 21H DX,STR1 AH,9 21H AL,NUM AH,0 BL,10 BL AX

;AX / BL ;入栈保护

;将十位数转换为ASCII码 ;送CRT显示

;AX中为待转换16进制数

;显示另一个字符串

;显示换行符,以便显示另一字串

;显示原字符串

;是空格,跳过下一句 ;非空格字符,NUM加1

;关键字符(空格)

;有SCAS指令,需用ES

MOV MOV LEA CLD MOV MOV JE

100 DUP(?)

DB ‘The number of non-space charactors is’,‘$’

START: MOV

NEXT: SCASB

INC LOOP LEA MOV INT MOV MOV INT LEA MOV INT MOV MOV MOV DIV PUSH OR MOV MOV INT POP

SKIP:

;将16进制的统计结果转换为十进制数,再转换为两个ASCII码输出

;商(十位)在AL中,余数(个位)在AH中,均为未组合BCD码

AL,30H DL,AL AH,2 21H AX

;恢复除法运算的结果

ADD MOV MOV INT MOV INT ENDS

AH,30H DL,AH AH,2 21H AH,4CH 21H

;将个位数转换为ASCII码 ;显示

;完成,返回DOS

CODE

END START

简析:

本例的关键在于统计结果的显示。统计完成后,结果单元中是一个16进制数。为符合一般习惯,应在CRT上显示十进制数,因此首先用除法将十位、个位分离开,再将其分别转换为ASCII码输出。由于除数是10,故相除之后得到的商(十位数)和余数(个位数)必在0~9范围内,即未组合BCD码,所以很容易转换为ASCII码。

编程时注意:DIV指令执行后结果在AX中,而DOS功能调用必须用AH为调用号,故应保护AX的内容。另外,原题已告知字串的结束符是0DH,故亦可通过检索结束符(0DH)的方式控制循环。

另外请注意:数据段中定义的STR串中出现的单引号前必须用另一个单引号转义,如“ ’s ”应为“ ’’s ”。 16. 数据段中有1个由小写英文字母组成的字符串,编程将各小写字母转换成对应的大写字母,并存放起来。

答:一种可能的程序如下实现:

DSEG

STR1 CHAR STR2 DSEG SSEG

SSEG CSEG

TRAN

SEGMENT

DB ‘djdwpneasmv’,‘$’

$-STR1-1 0AH,0DH

COUNT DUP(?),‘$’

DB DB ENDS

SEGMENT PARA STACK‘SSEG’ DW ENDS SEGMENT

ASSUME CS:CSEG,SS:SSEG,DS:DSEG,ES:DSEG PROC PUSH SUB PUSH MOV MOV MOV LEA MOV INT CLD

FAR DS AX,AX AX AX,DSEG DS,AX ES,AX DX,STR1 AH,9 21H

;自动增量

;有STOS指令,需用ES ;显示小写字母串

100 DUP(?)

COUNT EQU

LEA LEA MOV SUB ADD STOSB LOOP MOV MOV INT RET ENDP ENDS

SI,STR1 DI,STR2

;SI指向小写字母串 ;DI指向结果存放处 ;转换次数

;取1个小写字母至AL中 ;转换为大写字母 ;存放

;换行显示大写字母串

CX,COUNT AL,‘a’ AL,‘A’

NEXT

NEXT: LODSB

DX,OFFSET CHAR AH,9 21H

TRAN CSEG

END TRAN

本文来源:https://www.bwwdw.com/article/jr4o.html

Top