1、CH03 汇编语言程序设计习题参考答案1CH03 汇编语言程序设计习题与思考题1下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。VAR1 DB 10,2VAR2 DW 5 DUP(?) ,0VAR3 DB HOW ARE YOU? , $,3 DUP ( 1,2)VAR4 DD -1,1 ,0解答:字节空间-VAR1:2;VAR2:12;VAR3 :19; VAR4:12。存储空间的分配图:DS:0000 0A 02 00 00 00 00 00 0000 00 00 00 00 00 48 4F0010 57 20 41 52 45 20 59 4F55 3F 24 0
2、1 02 01 02 010020 02 FF FF FF FF 01 00 0000 00 00 00 002假定 VAR1 和 VAR2 为字变量,LAB 为标号,试指出下列指令的错误之处。(1)ADD VAR1,VAR2 (2)SUB AL,VAR1(3)JMP LABCX (4)JNZ VAR1(5) MOV 1000H,100 (6)SHL AL, 4 解答:(1)两个操作数中至少有一个为寄存器;(2)AL 为字节,VAR1 为字变量,不匹配;(3)中不能用 CX;(4)转向地址应为标号;(5)目的操作数的类型不确定;(6)SHL 指令中,当所移位数超过 1 时,必须用 CL 或 C
3、X 来取代所移位数。3对于下面的符号定义,指出下列指令的错误。A1 DB ?A2 DB 10K1 EQU 1024(1) MOV K1,AX (2)MOV A1,AX(3)CMP A1,A2 (4)K1 EQU 2048解答:(1)K1 为常量,不能用 MOV 指令赋值;(2)A1 为字节, AX 为字变量,不匹配;(3)A1 未定义,无法做比较指令;(4)K1 重新赋值前,必须用 PURGE 释放。4数据定义语句如下所示:FIRST DB 90H,5FH ,6EH,69HSECOND DB 5 DUP(?)THIRD DB 5 DUP(?)自 FIRST 单元开始存放的是一个四字节的十六进制
4、数(低位字节在前 ),要求:编一段程序将这个数左移两位后存放到自 SECOND 开始的单元,右移两位后存放到自THIRD 开始的单元。 (注意保留移出部分 )解答:DATA SEGMENTCH03 汇编语言程序设计习题参考答案2FIRST DB 90H,5FH , 6EH,69HSECOND DB 5 DUP(?)THIRD DB 5 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA SI,FIRSTLEA DI,SECONDMOV CX,2CLC;左移 2 位MOV AX,SIINC
5、SIINC SIMOV DX,SIPUSH DXPUSH AXROL DX,CLAND DL,03HMOV DI+4,DLROL AX,CLAND AL,03HMOV BL ,ALPOP AXPOP DXSHL DX,CLSHL AX,CLOR DL,BLMOV DI,AXMOV DI+2,DX;右移 2 位,类同左移的方法,略MOV AH,4CHINT 21HCODE ENDSEND START5 (原 14)在当前数据区从 400H 开始的 256 个单元中存放着一组数据,试编程序将它们顺序搬移到从 A000H 开始的顺序 256 个单元中。解答:DATA SEGMENTORG 400HD
6、AT1 DB .;256 DUP (?)ORG 0A000HDAT2 DB .;256 DUP (?)CH03 汇编语言程序设计习题参考答案3DATA ENDSSTACK SEGMENTSTACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AX;CH3-14LEA SI,DAT1LEA DI,DAT2MOV CX,128AGAIN: MOV AL,SIMOV DI,ALINC SIINC DILOOP AGAIN;CH3-15,将两个数据块逐个单元进行比较,若有错 BL=00H
7、,否则 BL=FFHLEA SI,DAT1LEA DI,DAT2MOV CX,128NEXT: MOV AL,SIMOV BL,DICMP AL,BLJNZ ERRORINC SIINC DILOOP NEXTMOV BL,0FFHJMP EXITERROR: MOV BL,00HEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START6试编程序将当前数据区从 BUFF 开始的 4K 个单元中均写入 55H,并逐个单元读出比较,看写入的与读出的是否一致。若全对,则将 ERR 单元置 0H;如果有错,则将 ERR 单元置 FFH。解答:DATA SEGMENTBUF
8、F DB 1000H DUP(?)ERR DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATACH03 汇编语言程序设计习题参考答案4START: MOV AX,DATAMOV DS,AX;将 55H 依次放入 BUFF 开始的 4K 个单元LEA SI,BUFFMOV CX,1000HMOV AL,55HNTXT: MOV SI,ALINC SILOOP NEXT;取出与 55H 比较,全对则 ERR=0,否则 ERR=FFHLEA DI,BUFFLEA SI,ERRMOV CX,1000HNEXT1: MOV AL,DIINC DICMP AL,5
9、5HJNZ ERROR;若有一个不同,即置 ERR=FFHLOOP NEXT1MOV AL,00HMOV SI,AL;全比较完无错,则置 ERR=0JMP EXITERROR: MOV AL,0FFHMOV SI,AL;返回 DOSEXIT: MOV AH,4CHINT 21HCODE ENDSEND STARTEND7在上题中,如果发现有错时,要求在 ERR 单元中存放出错的数据个数,则程序该如何修改?解答:DATA SEGMENTBUFF DB 1000H DUP(?)ERR DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV
10、 AX,DATAMOV DS,AX;将 55H 依次放入 BUFF 开始的 4K 个单元LEA SI,BUFFMOV CX,1000HMOV AL,55HNTXT: MOV SI,ALINC SICH03 汇编语言程序设计习题参考答案5LOOP NEXT;取出与 55H 比较LEA DI,BUFFLEA SI,ERRMOV DX,0000HMOV CX,1000HNEXT1: MOV AL,DIINC DICMP AL,55HJZ NEXT2;若相同,则比较下一个INC DX;否则将放出错个数的 DX 加 1NEXT2: LOOP NEXT1MOV SI,DXEXIT: MOV AH,4CHI
11、NT 21HCODE ENDSEND STARTEND8试编写程序段,完成将数据区从 0100H 开始的一串字节数据逐个从 F0H 端口输出,已知数据串以 0AH 为结束符。 (略)9(原 24)内存中以 FIRST 和 SECOND 开始的单元中分别存放着两个 4 位用压缩 BCD 码表示的十进制数, 低位在前。编程序求这两个数的和,仍用压缩 BCD 码表示, 并存到以THIRD 开始的单元。解答:DATA SEGMENTFIRST DW 3412HSECOND DW 7856HTHIRD DB ?,?,?DATA ENDSSTACK SEGMENTSTACK ENDSCODE SEGMEN
12、TASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,FIRSTLEA DI,SECONDLEA BX,THIRDMOV CX,2CLCAGAIN: MOV AL,BYTE PTRSIMOV DL,BYTE PTRDIADC AL,DLCH03 汇编语言程序设计习题参考答案6DAAMOV BYTE PTRBX,ALINC SIINC DIINC BXLOOP AGAINJC AAMOV BYTE PTRBX,0JMP EXITAA: MOV BYTE PTRBX,1EXIT: MOV AX,4C00H
13、INT 21HCODE ENDSEND START10(原 27)设字变量单元 A、B、C 存放有三个数,若三个数都不为零,则求三个数的和,存放在 D 中;若有一个为零,则将其余两个也清零,试编写程序。解答:DATA SEGMENTA DB ?B DB ?C DB ?D DW ?DATA ENDSSTACK SEGMENTSTACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,ALEA DI,DMOV AL,SICMP AL,00JZ ZEROADC DX,AL
14、LEA SI,BMOV AL,SICMP AL,00JZ ZEROADC DX,ALLEA SI,CMOV AL,SICMP AL,00JZ ZEROCH03 汇编语言程序设计习题参考答案7ADC DX,ALMOV DI,DXJMP EXITZERO: MOV AL,0MOV A,ALMOV B,ALMOV C,ALEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START11(16)试编程序,统计由 TABLE 开始的 128 个单元中所存放的字符 “A”的个数,并将结果存放在 DX 中。解答:DATA SEGMENTTABLE DB X1,X2,.X128DAT
15、A ENDSSTACK SEGMENTSTACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,TABLEMOV DX,0MOV CX,128AGAIN: MOV AL,SICMP AL,AJNZ NEXTINC DXNEXT: INC SILOOP AGAINMOV AX,4C00HINT 21HCODE ENDSEND START12试编制一个汇编语言程序,求出首地址为 DATA 的 1000 个字数组中的最小偶数,并把它存放于 MIN 单元中。 (方法:利用
16、书上排序的例题做相应的修改即可,略)13在上题中,如果要求同时找出最大和最小的偶数,并把它们分别存放于 MAX 和 MIN单元中,试完成程序。解答:略(方法同第 12 题) 。CH03 汇编语言程序设计习题参考答案814(28)在 DATA 字数组中存放有 100H 个 16 位补码数,试编写一程序求它们的平均值,放在 AX 中,并求出数组中有多少个数小于平均值,将结果存于 BX 中。 (略)15(17)编写一个子程序,对 AL 中的数据进行偶校验,并将经过校验的结果放回 AL 中。 解答:DATA SEGMENTCOUNT EQU 7DATA ENDSSTACK SEGMENTSTACK E
17、NDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AXPUSH AXMOV DX,0MOV CX,COUNTAGAIN: RCR AL,1JNC LINC DXL: LOOP AGAINPOP AXTEST DX,01JZ EXITOR AL,80EXIT: MOV AX,4C00HINT 21H;ANOTHER METHORDJP EXITOR AL,80HEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START16(18)利用上题的予程序,对 DATA
18、开始的 256 个单元的数据加上偶校验,试编程序。解答:DATA SEGMENTDAT DB .;256 DUP (?)RESULT DB .;256 DUP (?)NUM EQU 256COUNT EQU 7CH03 汇编语言程序设计习题参考答案9DATA ENDSSTACK SEGMENTSTACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,DATLEA DI,RESULTMOV CX,NUMNEXT: MOV AL,SICALL SUB1MOV DI,A
19、L;MOV SI,ALINC SIINC DILOOP NEXTMOV AX,4C00HINT 21HSUB1 PROCPUSH AXMOV DX,0MOV CX,COUNTAGAIN: RCR AL,1JNC LINC DXL: LOOP AGAINPOP AXTEST DX,01JZ QUITOR AL,80HQUIT: RETSUB1 ENDPCODE ENDSEND START17(19)试编写程序实现将键盘输入的小写字母转换成大写字母并输出。解答:DATA SEGMENTMESS DB THE INPUT IS NOT CORRECT.,0DH,0AH,$DATA ENDSSTACK
20、 SEGMENTSTACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATACH03 汇编语言程序设计习题参考答案10START: MOV AX,DATAMOV DS,AXNEXT: MOV AH,01HINT 21HCMP AL,QJZ EXITCMP AL,aJB ERRORCMP AL,zJA ERRORSUB AL,20HMOV AH,02HMOV DL,ALINT 21HJMP NEXTERROR: MOV AH,09HLEA DX,MESSINT 21HJMP NEXTEXIT: MOV AX,4C00HINT 21HC
21、ODE ENDSEND START18从键盘接收 20 个字符,按键入顺序查找最大的字符,并显示输出。解答:DATA SEGMENTDAT DB 20 DUP(?)DATA ENDSSTACK SEGMENTSTACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AX;从键盘接收 20 个字符,并送 DAT 中保存LEA SI,DATMOV CX,20NEXT: MOV AH,01HINT 21HMOV SI,ALINC SILOOP NEXT;比较 20 个字符中的最大字符,并
22、放入 AL 中MOV CX,19CH03 汇编语言程序设计习题参考答案11LEA SI,DATMOV AL,SIINC SINEXT1: CMP AL,SIJAE LLMOV AL,SILL: INC SILOOP NEXT1;将最大的字符的 ASCII 码由 AL 送 DL 显示MOV DL,ALMOV AH,2HINT 21H;返回 DOSMOV AX,4C00HINT 21HCODE ENDSEND START19(29)编写汇编程序,接收从键盘输入的 10 个数,输入回车符表示结束,然后将这些数加密后存于 BUFF 缓冲区中。加密表为:输入数字:0,1,2,3,4,5,6,7,8,9;
23、密码数字:7,5,9,1,3,6,8,0,2,4解答:DATA SEGMENTBUFF DB 10 DUP(?)TABLE DB 7,5,9,1,3,6,8,0,2,4DATA ENDSSTACK SEGMENTSTACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATASTART: MOV AX,DATAMOV DS,AX;LEA DI,BUFFNEXT: MOV AH,01HINT 21H;从键盘上接收单个字符CMP AL,0AH;与 0AH 比,判是否要结束JZ EXITSUB AL,30H;否则,将 09 的 ASCII 码
24、转换为十进制数LEA BX,TABLEXLAT;用查表指令进行加密MOV DI,ALINC DIJMP NEXTCH03 汇编语言程序设计习题参考答案12;退出并返回 DOSEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START20(23)有一个 100 个字节的数据表,表内元素已按从大到小的顺序排列好,现给定一元素,试编程序在表内查找,若表内已有此元素,则结束;否则,按顺序将此元素插入表中适当的位置,并修改表长。 (略)21(26)在当前数据段(DS ) ,偏移地址为 DATAB 开始的顺序 80 个单元中,存放着某班80 个同学某门考试成绩。按要求编写程序:
25、编写程序统计90 分;80 分89 分;70 分79 分;60 分69 分,60 分的人数各为多少,并将结果放在同一数据段、偏移地址为 BTRX 开始的顺序单元中。试编程序,求该班这门课的平均成绩为多少,并放在该数据段的 AVER 单元中。解答:;统计学生成绩DATA SEGMENTDATAB DB X1,X2,.,X80N EQU $-DATABORG 100HBTRX DW 0S8 DW 0S7 DW 0S6 DW 0S5 DW 0ORG 110HAVER DW ?DATA ENDSSTACK SEGMENT STACKSTA DB 20 DUP (0)TOP EQU $STASTACK
26、ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE, DS:DATA, SS:STACKSTART: PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV CX,NMOV BX,0000HMOV DX,0000HLEA SI,DATAB ;成绩表首地址COMPARE:MOV AL,SICH03 汇编语言程序设计习题参考答案13CMP AL,60 ;60?JL FIVECMP AX,70 ;70?JL SIXCMP AX,80 ;80?JL SEVENCMP AX,90 ;90?JL EIGHTINC S9JMP CHAEIGHT: INC S8JMP CHASEVEN: INC S7JMP CHASIX: INC S6JMP CHAFIVE: INC S5JMP CHACHA: ADD BX,ALJNC NEXTADC DX,0 NEXT:INC SI ;循环学生人数LOOP COMPAREMOV AX,BXMOV CX,NDIV CXMOV AVER,AXMOV AH,4CHINT 21HRETMAIN ENDPCODE ENDSEND START