第4章 习题及参考解答

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FORTHDB DUP(?)
自FIRST单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:
(1)编一段程序将这个数左移两位后存放到自SECOND开始的单元(注意保留移出部分);
(2)编一段程序将这个数右移两位后存放到自THIRD开始的单元(注意保留移出部分);
(3)编一段程序将这个数求补后存放到自FORTH开始的单元。
COUNTEOU$-BUF1
DB 3 DUP(?)
DATAENDS
STKSEGMENT STACK
DB 100 DUP(?)
STKENDS
CODESEGMENT
ASSUME CS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVS1,OFFSET BUF1
MOCCX,COUNT
MOV[DI],AX
MOV[DI+2],DX
MOV[DI+4],BL
RET
SUBP1ENDP
SUBP2PROC
MOVSI,OFFSET FIRST
MOVDI,OFFSET THIRD
XORBL,BL
MOVCL,2
MOVAX,[SI]
MOVDX,[SI+2]
LOP2:SHRDX,1
RCRAX,1
RCRBL,1
MOV [DI],AX
MOV AX,0
ADDC AX,0
MOV [DI+2],AX
MOV AX,[DI]
ADDCAX,[SI+4]
MOV[DI],AX
MOV AX,0
ADDC AX,[DI+2]
MOV [DI+2],AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
6.读下面程序段,问:在什么情况下本段程序的执行结果是AH=0?
MOV[BX],1000

(1)MOVK1,AX错。因为K1为立即数,它不能作为目的操作数。
(2)这两条指令都是错的。第一条立即数不能直接送给段寄存器;第二条两个操作数不能同时为内存操作数。
(3)MOVIMP,AX错。两操作数类型不匹配,IMP是一字节内存单元,而AX寄存器中为16位数据。
(4)CMPA1,A2错。两个操作数A1与A2不能同时为内存操作数。
INT21H
MOVDX,OFFSET BUF
MOVAH,0AH
INT21 H
MOVDX,OFFSET MSG2
MOVAH,9
INT21H
XORBX,BX
MOVBL,NUMB
MOVCHARS[BX],'$'
MOVDX,OFFSET CHARS
MOVAH,9
INT21H
MOV AH,4CH
INT21H
CODEENDS
(1)用比较、转移指令实现;
(2)用跳转表实现。
第4章习题及参考解答
1.试编一程序,把地址偏移量为100H单元开始的256个单元分别写入00H,01H,02H,03H,…,FFH数据。
解 源程序如下
DATASEGMENT
ORG100H
BUF1DB256 DUP(?)
COUNTEQU$-BUF1
DATAENDS
STKSEGMENT STACK
DB 100 DUP(?)
THREEDB2 DUP(?,8 DUP(0))
COUNTEQU 10
FOURDDCOUNT DUP(?)
FIVEDB‘HOW ARE YOU?’

ONEDW10;为ONE分配2个字节
TWODW4 DUP(?),5;为TWO分配10个字节
THREEDB2 DUP(?,8 DUP(0));为THREE分配18个字节
ENDSTART
说明
本题把数据区放在代码段中,没有单独定义数据段。并且用ORG 100H语句把程序起始地址的偏移量放在100H开始的单元,用JMP BEGIN指令跳过数据区,这样可以把该程序经汇编、连接后的执行程序(.EXE)用EXE2BIN软件生成.COM文件。
或:
DATASEGMENT
BUFDB41
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
INC BL;既不是0又不是负,则为正数,BL+1
JMPNEXT3
CALLSUBP2
CALLSUBP3
MOVAH,4CH
INT21H
SUBP1PROC
MOVSI,OFFSET FIRST
MOVDI,OFFSET SECOND
XORBL,BL
MOVCL,2
MOVAX,[SI]
MOVDX,[SI+2]
LOP1:SHLAX,1
RCLDX,1
RCLBL,1
DECCL
JNZLOP1

DATASEGMENT
BUFDW XXH,YYH,ZZH
SUMDW?,?
DATAENDS
CODESEGMENT
ASSUME CS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVSI,OFFSET BUF
MOVDI,OFFSET SUM
MOVAX,[SI]
ADDAX,[SI+2]
NUMBDB?
CHARSDB41DUP(?)
MSG1DB'Type anything,followed by enter.',0DH,0AH,'$'
MSG2DB0DH,0AH,'Contents of the KBD input buf:',0DH,0AH,'$'
DATAENDS
CODESEGMENT

DATASEGMENT
FIRSTDB 90H,5FH,6EH,69H
SECONDDB 5 DUP(?)
THIRD DB 5 DUP(?)
FORTH DBDUP(?)
DATAENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
CALLSUBP1
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MSG1
MOV AH,9
INT21H
MOV DX,OFFSET BUF
MOV AH,0AH
INT21 H
MOV DX,OFFSET MSG2
MOV AH,9
INT21H
XOR BX,BX
ZERO:INCDH;0的个数加1
JMBiblioteka BaiduNEXT3
NEGAT:INC BH;负数个数加1
NEXT3:INC SI;修改地址指针SI
LOOP NEXT2;未完,继续循环
MOV [SI],DH;存入0元素个数统计结果
INCSI
MOV [SI],BX;存入正、负数个数统计结果
MOV AH,4CH
INT21H
10.如下指令或程序是否有错,若有错,请指出错在哪里?
(1)KIEOU1024

MOVK1,AX
(2)MOVDS,100
MOV[1000],[2000]
(3)IMPDB?

MOV IMP,AX
(4)A1DB?
A2DB10

CMPA1,A2
(5)将1000送入X1单元,用如下程序:
X1DB ?

MOVBX,X1
MOV BL,NUMB
MOV CHARS[BX],'$'
MOV DX,OFFSET CHARS
MOV AH,9
INT21H
MOV AH,4CH
INT21H
CODEENDS
ENDSTART
13.某软件共可接收10个键盘命令(分别为A,B,C,…,J),完成这10个命令的程序分别为过程P0,P1,…,P9。编一程序从键盘接收命令,并转到相应的过程去执行。要求用两种方法:
LOOP NEXT
MOVAH,4CH
INT21 H
CODEENDS
ENDSTART
2.统计上题写入的数据块中0元素、正元素、负元素的个数,并分别把统计结果送入上述数据块之后的三个单元中。

DATASEGMENT
ORG 100H
BUF1DB 00H,01H.02H,…,0FEH,0FFH;共256个数据
START:INAL,5FH
MOVAH,0
JZBRCH
MOVAH,0
JMPSTOP
BRCH:MOVAH,0FFH
STOP:INT20H
解当标志寄存器的ZF=0时,执行结果AH=0。(JZ之前的两条指令对零标志没有影响)
7.下面语句在存储器中分别为变量分配多少字节?
0NEDW10
TW0DW4 DUP(?),5
DECCL
JNZLOP2
MOV[DI],BL
MOV[DI+1],AX
MOV[DI+3],DX
RET
SUBP2ENDP
SUBP3PROC
MOVSI,OFFSET FIRST
MOVDI,OFFSET FORTH
MOVAX,[SI]
MOVDX,[SI+2]
NOTAX
NOTDX
ADD AX,1
ADCDX,0
CODEENDS
ENDSTART
4.把地址偏移量为STRG1单元开始的128个单元的内容传送到地址偏移量为STRG2开始的单元中。

DATASEGMENT
STRGlDB XXH,XXH,XXH,….XXH;1 28个数据
COUNTEOU$-STRGl
STRG2DB 128 DUP(?)
DATAENDS
(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'。
COUNTEQU 10;不给COUNT分配存储单元
FOURDDCOUNT DUP(?);为FOUR分配40个字节
FIVEDB‘HOWARE YOU?’;为FIVE分配12个字节
8.数据定义语句如下所示:
FIRSTDB 90H,5FH,6EH,69H
SECOND DB 5 DUP(?)
THIRDDB 5 DUP(?)
12.使用DOS功能调用0AH从键盘输入40个字符的字符串并将其送入一输入缓冲区。在按下Enter键后,显示这些字符。

NAMEKBDINPUT
CODESEGMENT
ASSUMECS:CODE,DS:CODE
ORG 100H
START:JMP BEGIN
BUFDB41
NUMBDB?
CHARSDB41DUP(?)
MOV[DI],AX
MOV[DI+2],DX
RET
SUBP3ENDP
CODEENDS
ENDSTART
9.指令语句AND AX,OPD1 AND OPD2中,OPD1和OPD2是两个已赋值的变量,问两个AND操作分别在什么时间进行?有什么区别?
解 前面的AND是指令,在程序运行时执行,后面的AND是运算符,在汇编的时候由汇编程序计算,表达式计算结果出现在执行程序中。二者的区别在于,前者是指令,程序运行时执行,后者是运算符,汇编时计算。
CODESEGMENT
ASSUME CS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVSI,OFFSET STRG1
MOVDI,OFFSET STRG2
MOVCX,COUNT
CLD
REPMOVSB
MOVAH,4CH
INT21 H
CODEENDS
ENDSTART
5.寄存器SI做地址指针,自SI所指的内存单元开始连续存放三个无符号数(以字为单位),编一程序求它们的和,并将结果存放在这三个数之后的单元中。
MSG1DB'Type anything,followed by enter.',0DH,0AH,'$'
MSG2DB0DH,0AH,'Contents of the KBD input buf:',0DH,0AH,'$'
BEGIN:MOVAX,CS
MOVDS,AX
MOVDX,OFFSET MSG1
MOVAH,9
STKENDS
CODESEGMENT
ASSUME CS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVSI,OFFSET BUF1;戓LEA SI,BUF1
MOVCX,COUNT
XORAL,AL;或MOV AL,00H
NEXT:MOV[SI],AL
INCAL
INCSI
相关文档
最新文档