第4章习题及参考解答精选Word格式.docx
《第4章习题及参考解答精选Word格式.docx》由会员分享,可在线阅读,更多相关《第4章习题及参考解答精选Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
DB100DUP(?
CODESEGMENT
ASSUMECS:
START:
MOVS1,OFFSETBUF1
MOCCX,COUNT
XORBX,BX;
BL与BH分别存放正、负元素的个数
XORDH,DH;
DH寄存器存放0元素个数
NEXT2:
MOVAL,[SI]
CMPAL,0
JZZER0;
若ZF=1,则为0,转至ZERO,DH+1
JSNEGAT;
若SF=0则为负数,BH+1
INCBL;
既不是0又不是负,则为正数,BL+1
JMPNEXT3
ZERO:
INCDH;
0的个数加1
JMPNEXT3
NEGAT:
INCBH;
负数个数加1
NEXT3:
INCSI;
修改地址指针SI
LOOPNEXT2;
未完,继续循环
MOV[SI],DH;
存入0元素个数统计结果
INCSI
MOV[SI],BX;
存入正、负数个数统计结果
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
4.把地址偏移量为STRG1单元开始的128个单元的内容传送到地址偏移量为STRG2开始的单元中。
STRGlDBXXH,XXH,XXH,….XXH ;
128个数据
COUNTEOU$-STRGl
STRG2DB128DUP(?
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETSTRG1
MOVDI,OFFSETSTRG2
CLD
REPMOVSB
CODEENDS
5.寄存器SI做地址指针,自SI所指的内存单元开始连续存放三个无符号数(以字为单位),编一程序求它们的和,并将结果存放在这三个数之后的单元中。
解
BUFDWXXH,YYH,ZZH
SUMDW?
,?
START:
MOVSI,OFFSETBUF
MOVDI,OFFSETSUM
MOVAX,[SI]
ADDAX,[SI+2]
MOV[DI],AX
MOVAX,0
ADDCAX,0
MOV[DI+2],AX
MOVAX,[DI]
ADDCAX,[SI+4]
MOV[DI],AX
ADDCAX,[DI+2]
INT21H
6.读下面程序段,问:
在什么情况下本段程序的执行结果是AH=0?
IN AL,5FH
MOVAH,0
JZBRCH
JMPSTOP
BRCH:
MOVAH,0FFH
STOP:
INT20H
解当标志寄存器的ZF=0时,执行结果AH=0。
(JZ之前的两条指令对零标志没有影响)
7.下面语句在存储器中分别为变量分配多少字节?
0NEDW10
TW0DW4DUP(?
),5
THREEDB2DUP(?
,8DUP(0))
COUNTEQU10
FOURDDCOUNTDUP(?
FIVEDB ‘HOWAREYOU?
’
ONEDW10;
为ONE分配2个字节
TWODW4DUP(?
),5;
为TWO分配10个字节
THREEDB2DUP(?
,8DUP(0));
为THREE分配18个字节
COUNTEQU10;
不给COUNT分配存储单元
FOURDDCOUNTDUP(?
);
为FOUR分配40个字节
FIVEDB‘HOWAREYOU?
’;
为FIVE分配12个字节
8.数据定义语句如下所示:
FIRSTDB90H,5FH,6EH,69H
SECONDDB5DUP(?
THIRDDB5DUP(?
FORTHDBDUP(?
自FIRST单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:
(1)编一段程序将这个数左移两位后存放到自SECOND开始的单元(注意保留移出部分);
(2)编一段程序将这个数右移两位后存放到自THIRD开始的单元(注意保留移出部分);
(3)编一段程序将这个数求补后存放到自FORTH开始的单元。
FIRSTDB90H,5FH,6EH,69H
SECONDDB5DUP(?
THIRDDB5DUP(?
FORTHDBDUP(?
CODESEGMENT
CALLSUBP1
CALLSUBP2
CALLSUBP3
SUBP1PROC
MOVSI,OFFSETFIRST
MOVDI,OFFSETSECOND
XORBL,BL
MOVCL,2
MOVAX,[SI]
MOVDX,[SI+2]
LOP1:
SHLAX,1
RCLDX,1
RCLBL,1
DECCL
JNZLOP1
MOV[DI],AX
MOV[DI+2],DX
MOV[DI+4],BL
RET
SUBP1ENDP
SUBP2PROC
MOVDI,OFFSETTHIRD
MOVCL,2
MOVDX,[SI+2]
LOP2:
SHRDX,1
RCRAX,1
RCRBL,1
JNZLOP2
MOV[DI],BL
MOV[DI+1],AX
MOV[DI+3],DX
SUBP2ENDP
SUBP3PROC
MOVDI,OFFSETFORTH
MOVDX,[SI+2]
NOTAX
NOTDX
ADDAX,1
ADCDX,0
SUBP3ENDP
9.指令语句ANDAX,OPD1ANDOPD2中,OPD1和OPD2是两个已赋值的变量,问两个AND操作分别在什么时间进行?
有什么区别?
解 前面的AND是指令,在程序运行时执行,后面的AND是运算符,在汇编的时候由汇编程序计算,表达式计算结果出现在执行程序中。
二者的区别在于,前者是指令,程序运行时执行,后者是运算符,汇编时计算。
10.如下指令或程序是否有错,若有错,请指出错在哪里?
(1)KIEOU1024
┇
MOVK1,AX
(2)MOVDS,100
MOV[1000],[2000]
(3)IMPDB?
MOVIMP,AX
(4)A1DB?
A2DB10
CMPA1,A2
(5)将1000送入X1单元,用如下程序:
X1DB?
MOVBX,X1
MOV[BX],1000
(1)MOVK1,AX错。
因为K1为立即数,它不能作为目的操作数。
(2)这两条指令都是错的。
第一条立即数不能直接送给段寄存器;
第二条两个操作数不能同时为内存操作数。
(3)MOVIMP,AX错。
两操作数类型不匹配,IMP是一字节内存单元,而AX寄存器中为16位数据。
(4)CMPA1,A2错。
两个操作数A1与A2不能同时为内存操作数。
(5)MOV[BX],1000错。
两操作数类型不匹配,[BX]只定义了一字节单元,而1000是16位数据。
11.8086汇编语言程序中段的类型有几种?
各段如何定义?
段定义语句中,定位类型、组合类型、类别各起什么作用?
各有什么含义?
解 8086汇编语言中,段的类型有三种,即代码段、堆栈段、数据段(附加数据段可归属于数据段)。
各段可用段定义语句(SEGMENT与ENDS)和段名赋给段寄存器语句(ASSUME)来定义。
段定义语句中,定位类型表示此段的起始边界要求,可允许4种段的起始边界,即PAGE、PARA、WORD或BYTE。
它们分别表示段的起始值为以页、节、字、字节为边界,若此项省略,则默认值为PARA。
组合类型用来告诉连接程序本段与其他段的关系,分别为NONE、PUBLIC、COMMON、AT表达式、STACK或MEMORY。
每一种的含义请参看主教材。
类别是连接程序(LINK)需要的。
它可以是任何合法的名称,必须用单引号括起来,连接程序只使同类别的段发生关联。
典型类别如‘CODE’、'
STACK'
。
12.使用DOS功能调用0AH从键盘输入40个字符的字符串并将其送入一输入缓冲区。
在按下Enter键后,显示这些字符。
NAMEKBDINPUT
CODE
JMPBEGIN
BUFDB 41
NUMBDB?
CHARSDB41DUP(?
MSG1 DB '
Typeanything,followedbyenter.'
,0DH,0AH,'
$'
MSG2DB0DH,0AH,'
ContentsoftheKBDinputbuf:
'
BEGIN:
MOVAX,CS
MOVDX,OFFSETMSG1
MOVAH,9
MOVDX,OFFSETBUF
MOVAH,0AH
MOVDX,OFFSETMSG2
XORBX,BX
MOVBL,NUMB
MOVCHARS[BX],'
MOVDX,OFFSETCHARS
说明
本题把数据区放在代码段中,没有单独定义数据段。
并且用ORG100H语句把程序起始地址的偏移量放在100H开始的单元,用JMPBEGIN指令跳过数据区,这样可以把该程序经汇编、连接后的执行程序(.EXE)用EXE2BIN软件生成.COM文件。
或:
DATAENDS
MOVAX,DATA
XORBX,BX
13.某软件共可接收10个键盘命令(分别为A,B,C,…,J),完成这10个命令的程序分别为过程P0,P1,…,P9。
编一程序从键盘接收命令,并转到相应的过程去执行。
要求用两种方法:
(1)用比较、转移指令实现;
(2)用跳转表实现。
(1)用比较、转移指令实现
ORG100H
JMPBEGlN
MSGDB'
Errorcharacter!
,0DH,OAH,'
BEGlN:
MOV AX,CS
MOV DS,AX
MOVAH,1
CMPAL,'
A'
JZPS0
B'
JZPS1
C'
JZPS2
D'
JZPS3
E'
JZPS4
F'
JZPS5
G'
JZPS6
H'
JZPS7
CMPAL,'
I'
JZPS8
J'
JZPS9
MOVDX,OFFSETMSG
MOVAH,9
INT21H
JMPBEGIN
PS0:
CALLP0
JMPBEGIN
PS1:
CALLP1
PS2:
CALLP2
┇
PS9:
CALLP9
INT21H
P0PROC
┇
RET
P0ENDP
P1PROC
P1ENDP
P9PROC
P9ENDP
ENDSTART
DATASEGMENT
MSGDB'
MOV AX,DATA
(2)用跳转表实现
DATASEGMENT
PTABDW0000H;
Firstprogramentrance
DW0100H
DW0200H
DW0300H
DW0400H
DW0500H
DW0600H
DW0700H
DW0800H
DW0900H;
Nineteenthprogramentrance
MOVAX,DATA
MOVBX,OFFSETPTAB
MOVAH,1
XORAH,AH
SUBAL,41H
LOP:
SHLAX,1
ADDBX,AX
JMPWORDPTR[BX]
讨论
实现该题的功能用两种方法都可以,显然,用跳转表实现要简单快捷得多。
所以遇到多分支程序结构时采用跳转表比用条件转移指令更方便。
14.内存自BUFF单元的缓冲区连续放着512个学生的英文分数,编程序统计其中90~100,60~89,60分以下者各有多少人,并把结果连续存放到RESULT开始的单元中。
BUFlDB86,92,65,78,45,88,55,100,…,76;
共有512个字节数据,数据范围为0~100
COUNTEOU$-BUF1
RESULTDW3DUP(?
STACKSEGMENTSTACK'
STAPNDB100HDUP(?
STACKENDS
DATA,SS:
STACK
MOV DS,AX
MOVSI,OFFSETBUF1
MOVDI,OFFSETRESULT
XORBX,BX;
BX存放90~100分的学生个数
XORDX,DX;
DX存放60~89分的学生个数
XORBP,BP;
BP存放00~59分的学生个数
NEXT:
LODSB;
取学生分数
CMPAL,90;
是否大干等于90分
JNCNEXT1;
大于等于90分,转到BX+1
CMPAL,60;
是否大于等于60分
JNCNEXT2;
大干等于60分,转到DX+1
INCBP;
小于60分,BP+1
JMPDONE
NEXT1:
INCBX;
90~100分的个数加1
JMPDONE
NEXT2:
INCDX;
60~89分的个数加1
DONE:
MOV[DI],BX
ADDDI,2
MOV[DI],DX
MOV[DI],BP
15.设有一数据块,共有100个字节,试找出数据块中最大者,并把它送至MAX单元中。
0RG100H
BUFDB12H,56H,0ABH,…,0FDH,00H;
共100个字节无符号数
COUNTEQU$-BUF
MAXDB?
CMPAL,[SI]
JGLOP2
XCHGAL,[SI];
用MOV AL,[SI]似乎要好一些,不会破坏原始数据。
LOOPLOP1
MOVMAX,AL
CODEENDS
XCHGAL,[SI];
MO