“微机系统原理与接口技术”第四章习题解答
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