2022年微机原理与接口技术习题答案 5.pdf
第 4 章 汇编语言程序设计1.已知在 BUF 的起始处保存有N 个字符的ASCII 码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR 中,并且使字符串的顺序与原来的顺序相反。解: BUF DB BONJOUR_BELLE BUFR DB 100 DUP(?) MOV CX, N LEA SI, BUF LEA DI, BUFR ADD DI,CX DEC DI L1: MOV AL,SI MOV DI,AL INC SI DEC DI LOOP L1 2.利用移位、传送和相加指令实现AX 的内容扩大10 倍。解:将扩大后的结果放在DX :AX 中,注意到10 AX 8AX 2 AX 。XOR DX,DX SHL AX, 1 RCL DX, 1 MOV BX,AX MOV CX,DX SHL AX, 1 RCL DX, 1 SHL AX, 1 RCL DX, 1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 22 页 - - - - - - - - - ADD AX, BX ADC DX, CX 3.在缓冲区 VAR 中连续存放着3个 16位的无符号数, 编写程序实现将其按递增关系排列;如果 VAR 中保存的为有符号数,则再编写程序实现将其按递减关系排列。解: VAR DW 1236 ,-432,3900 XOR SI,SI MOV AX,V ARSI CMP AX, V ARSI+2 JAE L1 XCHG AX, V ARSI+2 L1: CMP AX, V ARSI+4 JAE L2 XCHG AX, V ARSI+4 L2: MOV VARSI, AX MOV AX,V ARSI+2 CMP AX, V ARSI+4 JAE L3 XCHG AX, V ARSI+4 L3: MOV VARSI+2, AX 4.编写程序段实现将AL 和 BL 中的每一位依次交叉,得到的16 位字保存在DX 中,例如( AL ) 01100101B, (BL ) 11011010B,则得到的( DX )10110110 10011001B。解:利用移位指令完成。XOR DX,DX MOV CX,8 L1: SHR AL,1 RCR DX,1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 22 页 - - - - - - - - - SHR BL,1 RCR DX,1 LOOP L1 5.在变量 VAR1 和 VAR2 中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现:( 1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;(2)当两数均为奇数时,两个变量的内容不变;(3)当两数均为偶数时,两数缩小一倍后存入原处。解:当VAR1 为奇数时,不论VAR2 的奇偶性,这两个单元的内容均不变;只有当VAR1为偶数时,如果VAR2 为奇数,则VAR1 与 VAR2 内容交换;如果VAR2 为偶数,则两数缩小一倍后存入原处。DATA SEGMENT VAR1 DB 28 VAR2 DB 36 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DA TA MOV DS,AX MOV ES, AX MOV AL,V AR1 MOV BL,VAR2 TEST AL,1 JZ EVEN1 JMP OVER EVEN1: TEST BL,1 JZ EVEN2 MOV VAR1,BL 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 22 页 - - - - - - - - - MOV VAR2,AL JMP OVER EVEN2: SHR AL,1 MOV VAR1,AL SHR BL,1 MOV VAR2,BL OVER: MOV AH,4CH MOV AL,0 INT 21H CODE ENDS END START 6.已知在字变量VAR1 、VAR2 和 VAR3 中保存有 3 个相同的代码,但有一个错码,编写程序段找出这个错码,并将它送到AX ,其地址送SI;如果 3 个代码都相同,则在AX中置 1 标志。解:在数据段中定义:VAR1 DW 5A34H VAR2 DW 5A35H VAR3 DW 3A34H 在代码段中编写程序段:MOV AX,-1 MOV BX,V AR1 CMP BX,V AR2 JZ L2 CMP BX,V AR3 JZ L1 MOV AX,BX LEA SI,VAR1 JMP OVER 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 22 页 - - - - - - - - - L1: MOV AX,V AR2 LEA SI,VAR2 JMP OVER L2: CMP BX,V AR3 JZ OVER MOV AX,V AR3 LEA SI,VAR3 OVER: 7.分析下列程序段的功能:MOV CL , 04 SHL DX ,CL MOV BL , AH SHL AX ,CL SHR BL ,CL OR DL , BL 解:程序段完成DX:AX组成的 32 位无符号数左移4位,低位补零(也即除以16) 。8.下列程序段执行后,求BX 寄存器的内容:MOV CL , 3 MOV BX ,0B7H ROL BX ,1 ROR BX ,CL 解:实际上完成BX 内容循环右移2位,因此, BX 寄存器的内容为C02DH 。9.下列程序段执行后,求BX 寄存器的内容:MOV CL , 5 MOV BX ,7D5CH SHR BX ,CL 解:完成 BX 内容逻辑右移5 位,因此, BX 寄存器的内容为03EAH 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 22 页 - - - - - - - - - 10.将 BUFFERS 中 N 个字按相反顺序传递到BUFFERT 中。解:LEA SI,BUFFERS LEA DI,BUFFERT MOV CX,N ADD DI,N ADD DI,N SUB DI,2 L1: MOV AX,SI MOV DI,AX ADD SI,2 SUB DI,2 LOOP L1 11.数组 ARRAY中存放有一组字型数据,前两个字节存放数据长度(5 的倍数)。为给这个数组中的数据进行加密保护,每 5 个数据取出一个数据进行加密处理:奇数位进行取反,偶数位不变, 例如对数据0110 1100 1011 0001B 加密后变成1100 0110 0001 1011B,编写加密程序encrpytion 和解密程序unencrpytion 。解:约定从第一个数据开始,每 5 个数据为一组, 每组中的第一个数据采取加密/解密处理。由于加密算法采用的是取反操作,解密算法也采用取反操作,因此解密和解密算法是同一个程序。ENCRPYTION PROC NEAR LEA SI,ARRAY XOR DX,DX MOV AX,SI MOV BX,5 DIV BX MOV CX, AX ADD SI, 2 L1: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 22 页 - - - - - - - - - MOV AX, SI XOR AX,0AAAAH MOV SI, AX ADD SI,10 LOOP L1 RET ENCRPYTION ENDP 13.设 BUF 中存放有 N 个无符号数(或有符号数),编程实现求它们的最小值(存入AX )和最大值(存入DX ) 。解: BUF 存放有 N 个无符号数的程序如下:MOV CX,N-1 LEA SI,BUF MOV AX,SI MOV DX,AX ADD SI,2 L1: CMP AX,SI JBE NOCHG1 XCHG AX,SI NOCHG1: CMP DX,SI JAE NOCHG2 XCHG DX,SI NOCHG2: ADD SI,2 LOOP L1 如果 BUF 中存放的是有符号数,则只需要将程序中的两行内容修改:JBE NOCHG1 改成: JLE NOCHG1 JAE NOCHG2 改成: JGE NOCHG2 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 22 页 - - - - - - - - - 14.设 BUFFER 中存放有N 个无符号 (第 1个字节存放缓冲区的长度),编程实现将其中的0 元素抹去,并更新其长度。解:设BUFFER 中存放的是字节型数据。采用双指针方法:SI 为读指针, DI 为写指针,从低地址开始,内存中读出一个字节,如果不为0,则写入内存;如果为0,则不进行写操作。LEA SI, BUFFER XOR CX,CX MOV CL, SI INC SI MOV DI, SI XOR BH,BH XOR AL,AL L1: CMP SI,AL JZ L2 MOV BL,SI MOV DI,BL INC DI INC BH L2: INC SI LOOP L1 MOV BUFFER,BH 16.编写一个子程序实现统计AL 中 1 的个数,然后检测出字节型缓冲区BUF 中 0 和 1 个数相等的元素个数。解:统计AL 中 1 的个数,只需将AL 右移,移出的一位内容进行累加,子程序为:COUNTBYTE PROC NEAR PUSH AX PUSH CX 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 22 页 - - - - - - - - - MOV CX,8 XOR BL,BL COU1: SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTBYTE ENDP 在此基础上,可以检测出字节型缓冲区BUF 中 0 和 1 个数相等的元素个数,即一个字节中有 4 个 1。设 BUF 中有 N 个字节型数据,结果保持在BH 中。MOV CX,N LEA SI, BUF XOR BH,BH L1: MOV AL,SI CALL COUNTBYTE CMP BL,4 JNZ L2 INC BH L2: INC SI LOOP L1 19.在缓冲区 BUFFER 中,第 1 个字节存放数组的长度(256) ,从第 2 个字节开始存放字符的 ASCII 码,编写子程序完成在最高位给字符加上偶校验。解: STACK SEGMENT STACK STACK DW 100H DUP (?)TOP LABEL BYTE STACK ENDS 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 22 页 - - - - - - - - - DATA SEGMENT BUFFER DB 3 ;首字节为字符串长度DB ABC ;字符串DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AX,DA TA MOV DS,AX MOV ES,AX LEA DI,BUFFER XOR CX,CX MOV CL,DI INC DI CALL SETEVEN MOV AH,4CH ;返回 DOS MOV AL,0 INT 21H SETEVEN PROC NEAR ;加偶校验子程序PUSH AX PUSH BX PUSH CX PUSH DI SETEVEN1: MOV AL,DI CALL COUNTBYTE 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 22 页 - - - - - - - - - AND BL,01H JZ SETEVEN2 OR AL,80H MOV DI,AL SETEVEN2: INC DI LOOP SETEVEN1 POP DI POP CX POP BX POP AX RET SETEVEN ENDP COUNTBYTE PROC NEAR PUSH AX PUSH CX MOV CX,8 XOR BL,BL COU1: SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTBYTE ENDP CODE ENDS END START 20. 编写程序完成求多位数(N 个字)的绝对值。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 22 页 - - - - - - - - - 21. 已知斐波那契数列的定义为:) 3(, 1, 12121iFFFFFiii,编写求该数列前 n 项的子程序。解:设奖斐波那契数列存放在字变量RESULT 中。在数据段中定义RESULT DW 100H DUP (?)在代码段中编写子程序FIBONACCI PROC NEAR XOR DI,DI MOV RESULTDI,1 ;前两个数为1 MOV RESULTDI+2,1 ADD DI,4 MOV CX,N L1: MOV AX, RESULTDI-4 ADD AX, RESULTDI-2 MOV RESULTDI,AX ADD DI,2 LOOP L1 RET FIBONACCI ENDP 22. 编写程序实现循环显示10 条信息,保存每条信息的变量分别为INFOM1 INFORM10 。解:在数据段中定义变量:TABLE DW INFORM1, INFORM2, INFORM3, INFORM4, INFORM5 DW INFORM6, INFORM7, INFORM8, INFORM9, INFORM10 在代码段中编写程序段:MOV CX,10 XOR SI,SI L1: MOV DX,TABLESI MOV AH,9 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 22 页 - - - - - - - - - INT 21H ADD SI,2 CALL WAIT LOOP L1 这里, WAIT 为延时子程序,用于在显示信息之间的停顿。23. 编写程序实现将包含20 个数据的数组ARRAY 分成两个数组:正数数组ARRAYP 和负数数组 ARRAYN ,并分别将这两个数组中数据的个数显示出来。解:先编写一个子程序DISPALD ,完成以3 位十进制数形式显示出AL 的内容。DISPALD PROC NEAR PUSH AX PUSH CX PUSH DX XOR AH,AH MOV CL,100 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2 INT 21H POP AX MOV AL,AH XOR AH,AH MOV CL,10 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 22 页 - - - - - - - - - INT 21H POP AX MOV DL,30H ADD DL,AH MOV AH,2 INT 21H POP DX POP CX POP AX RET DISPALD ENDP 在此基础上,根据题目要求,需要用到3 个指针: SI 指向源数组ARRAY ,DI 指向正数数组 ARRAYP ,BX 指向负数数组ARRAYN 。MOV CX,20 XOR DX,DX LEA SI,ARRAY LEA DI,ARRAYP LEA BX,ARRAYN L1: MOV AL,SI AND AL,AL JS L2 MOV DI,AL INC DI INC DL JMP L3 L2: MOV BX,AL INC BX INC DH L3: INC SI 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 22 页 - - - - - - - - - LOOP L1 MOV AL,DL CALL DISPALD MOV AL,DH CALL DISPALD 24. 编写程序实现求缓冲区BUFFER 的 100 个字中的最小偶数(存入AX ) 。解:设 BUFFER 中存放的是有符号数。MOV CX,100 LEA SI,BUFFER MOV AX, 7FFFH L1: AND WORD PTR SI,1 JNZ L2 CMP SI,AX JGE L2 MOV AX,SI L2: ADD SI,2 LOOP L1 25. 编写程序实现求级数22221n的前 n 项和刚大于2000 的项数 n。解: BL 用于存放项数。STACK SEGMENT STACK STACK DW 100H DUP (?)TOP LABEL WORD STACK ENDS DATA SEGMENT DB 100H DUP (?)DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 22 页 - - - - - - - - - MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SP,TOP MOV BL,1 MOV CX,0 COUNT: MOV AL, BL MUL BL ADD CX,AX CMP CX,2000 JA EXIT INC BL JMP COUNT EXIT: 26. 定义一条宏指令,实现将指定数据段的段地址传送到段寄存器ES或 DS 的功能。解:27. 定义一条宏指令,实现从键盘中输入一个字符串(利用INT 21H 的 09 号功能)。28. 定义一条宏指令,实现在屏幕上输出回车、换行。29. 利用其它指令完成与下列指令一样的功能:(1)REP MOVSB ;(2)REP LODSB ;(3)REP STOSB;(4)REP SCASB。解:设 DF=0 (1)L1: MOV AL,SI MOV ES:DI,AL INC SI INC DI 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 22 页 - - - - - - - - - LOOP L1 (2)L1: MOV AL,SI INC SI LOOP L1 (3)L1: MOV ES:DI,AL INC DI LOOP L1 (4)L1: MOV AL,SI CMP AL,ES:DI INC SI INC DI LOOP L1 30. 设在数据段中定义了:STR1 DB ASSEMBLE LANGUAGE STR2 DB 20 DUP(?) 利用字符串指令编写程序段实现:(1)从左到右将STR1 中的字符串传送到STR2;(2)从右到左将STR1 中的字符串传送到STR2;(3)将 STR1 中的第 6 个和第 7 个字节装入DX ;(4)扫描 STR1 字符串中有无空格,如有则将第一个空格符的地址传送到SI。解:STR1 中有 17 个字符(含一个空格) ,设 DS 和 ES均指向 STR1 和 STR2 所在的段。(1)CLD MOV CX,17 LEA SI,STR1 LEA DI,STR2 REP MOVSB (2)MOV CX,17 LEA SI,STR1 LEA DI,STR2 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 22 页 - - - - - - - - - ADD SI,CX DEC SI L1: MOV AL,SI MOV DI,AL DEC SI INC DI LOOP L1 (3)LEA SI,STR1 MOV DX,SI+6 (4)MOV CX,17 LEA SI,STR1 MOV AL,20H L1: CMP SI, AL JZ L2 INC SI LOOP L1 L2: 31. 设在数据段中定义了:STRING DB Today is Sunday & July 16, 2000 编写程序实现将STRING 中的 & 用 / 代替。解: STRING 中保存了30 个字符。MOV CX,30 LEA SI,STRING MOV AL, &L1: CMP SI,AL JNZ L2 MOV BYTE PTR SI , /L2: INC SI LOOP L1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 22 页 - - - - - - - - - 32. 分析下列程序段完成的功能:MOV CX ,100 LEA SI ,FIRST LEA DI ,SECOND REP MOVSB 解:将缓冲区FIRST 中 100 个字节传送到SECOND 中。33. 分析下列程序段:LEA DI ,STRING MOV CX ,200 CLD MOV AL ,20H REPZ SCASB JNZ FOUND JMP NOT_FOUND 问:转移到FOUND 的条件。解:在缓冲区STRING 中搜索非空格字符,如果有非空格则转到FOUND ,如果 200 个单元中都是空格,则转到NOT_FOUND 。34. 设在数据段的变量OLDS 和 NEWS 中保存有5 个字节的字符串,如果OLDS 字符串不同于 NEWS 字符串,则执行NEW_LESS ,否则顺序执行程序。解:设 DS 和 ES 均指向字符串OLDS 和 NEWS 所在的段。CLD MOV CX,5 LEA SI,OLDS LEA DI,NEWS REPZ CMPSB JNZ NEW_LESS 35. 编程实现将STRING 字符串中的小写字母变换成大写字母。解:设 STRING 中的字符个数为N。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 22 页 - - - - - - - - - MOV CX,N LEA SI,STRING MOV AL,5FH L1: AND SI,AL INC SI LOOP L1 36. 设在数据段中定义了:STUDENT_NAME DB 30 DUP(?)STUDENT_ADDR DB 9 DUP(?)STUDENT_PRINT DB 50 DUP (?)编写程序实现:用空格符清除缓冲区STUDENT_PRINT ;在 STUDENT_ADDR中查找第一个 _ 字符;在 STUDENT_ADDR中查找最后一个 _ 字符;如果 STUDENT_NAME中全为空格符,则STUDENT_PRINT全存入 * ;将 STUDENT_NAME传送到 STUDENT_PRINT的前 30 个字节中,将 STUDENT_ADDR传送到 STUDENT_PRINT的后 9 个字节中。37.(上机题 )编写程序实现,将缓冲区BUFFER 中的 100 个字按递增排序,并按下列格式顺序显示:数据 1 数据 2 ,38. (上机题 )按同余法产生一组随机数N(1N=50 ) ,并按 N50 赋给 45 名同学的 5 门课程的成绩, 要求编程实现计算每个同学的平均成绩,并根据平均成绩统计全班的成绩各等级的人数( A:90100,B:8089,C:7079,D:6669,E:6065,F: 60 分以下),按下列格式显示:Total A: B: C: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 22 页 - - - - - - - - - D: E: F: 39 (上机题 )编写程序实现下列5 项功能,通过从键盘输入15 进行菜单式选择:( 1)按数字键“1” ,完成将字符串中的小写字母变换成大写字母。用户输入由英文大小写字母或数字09 组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:例如: abcdgyt0092 ABCDGYT0092 按任一键重做;按Esc 键返回主菜单。(2)按数字键“ 2” ,完成在字符串中找最大值。用户输入由英文大小写字母或数字09 组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示: The maximum is 按任一键重做;按Esc 键返回主菜单。(3)按数字键“3” ,完成输入数据组的排序。用户输入一组十进制数值(小于255) ,然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示: 按任一键重做;按Esc 键返回主菜单。(4)按数字键“4” ,完成时间的显示。首先提示用户对时,即改变系统的定时器HH :MM :SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时间: HH:MM : SS。按任一键重新对时;按Esc 键返回主菜单。(5)按数字键“5” ,结束程序的运行,返回操作系统。解:主程序的编程思路:此程序共 5 个功能,可采用跳转表法来实现多路分支结构程序设计。现将这 5 个程序段,各程序段的首地址分别标号为G1, G2, G3, G4, G5。 将 5 个程序段的入口地址做成表TABLE放入数据段,程序根据给定的参数计算出欲转入的程序段的首地址在TABLE 中的位置后,取出该地址,跳转至该程序段。首先,通过调用子程序MENU ,设置显示器,并输出提示文档。接着,读取 1 - 5 之间的 ASCII 表示数。然后,通过跳转表TABLE 实现由输入参数转入相应的程序段。由于表中名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 22 页 - - - - - - - - - 按“字”存放数据,则每个数据的位移量是:0、2、4、6、8。对于输入参数N,计算位移量的公式是N=(N-1)*2 。当输入 1 时,跳转到标号G1。调用子程序CHGLTR ,完成将输入字符串中的小写字母变换成大写字母。用户按键,若为ESC ,则转到主程序段首调用MENU ,否则,转到标号G1 ;当输入 2 时,跳转到标号G2。调用子程序MAXLTR ,完成在输入字符串中找最大值。用户按键,若为ESC ,则转到主程序段首调用MENU ,否则,转到标号G2 ;当输入 3 时,跳转到标号G3。调用子程序SORTNUM ,完成输入数据组的排序。用户按键,若为ESC ,则转到主程序段首调用MENU ,否则,转到标号G3 。当输入 4 时,跳转到标号G4。调用子程序TIMCHK ,完成时间的显示。用户按键,若为 ESC ,则转到主程序段首调用MENU ,否则,转到标号G4 。当输入 5 时,跳转到标号G5。结束程序的运行,返回操作系统。其流程框图见图3-1。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 22 页 - - - - - - - - -