1、微机原理与接口技术(楼顺天第二版)习题解答 第 4 章 汇编语言程序设计 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 4.2、利用移位、传送和相加指令实现 AX 的内容扩大 10 倍。
2、答:将扩大后的结果放在 DX: AX 中,注意到 10 AX 8 AX 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 ADD AX, BX ADC DX, CX 4.3、在缓冲区 VAR 中连续存放着 3 个 16 位的无符号数,编写程序实现将其按递增关系排列;如果 VAR 中保存的为有符号数,则 再编写程序实现将其按递减关系排列。 答 : VAR DW 1236, -432, 3900 XOR SI,SI MOV AX,VARSI CMP AX,
3、VARSI+2 JAE L1 XCHG AX, VARSI+2 L1: CMP AX, VARSI+4 JAE L2 XCHG AX, VARSI+4 L2: MOV VARSI, AX MOV AX,VARSI+2 CMP AX, VARSI+4 JAE L3 XCHG AX, VARSI+4 L3: MOV VARSI+2, AX 4.4、编写程序段实现将 AL 和 BL 中的每一位依次交叉 , 得到的 16 位字保存在 DX 中 , 例如 ( AL) 01100101B,( BL) 11011010B, 则得到的 ( DX) 10110110 10011001B。 答 : 利用移位指令完
4、成。 XOR DX,DX MOV CX,8 L1: SHR AL,1 RCR DX,1 SHR BL,1 RCR DX,1 LOOP L1 4.5、在变量 VAR1 和 VAR2 中分别保存有两个字节型的正整数,编写完整的汇 编语言程序实现: ( 1)当两数中有一个奇数时,将奇数存入 VAR1,偶数存入 VAR2; ( 2)当两数均为奇数时,两个变量的内容不变; ( 3)当两数均为偶数时,两数缩小一倍后存入原处。 答 : 当 VAR1 为奇数时,不论 VAR2 的奇偶性,这两个单元的内容均不变;只有当 VAR1为偶数时,如果 VAR2 为奇数,则 VAR1 与 VAR2 内容交换;如果 VAR
5、2 为偶数,则 两数缩小一倍后存入原处。 DATA SEGMENT VAR1 DB 28 VAR2 DB 36 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS,AX MOV ES, AX MOV AL,VAR1 MOV BL,VAR2 TEST AL,1 JZ EVEN1 JMP OVER EVEN1: TEST BL,1 JZ EVEN2 MOV VAR1,BL MOV VAR2,AL JMP OVER EVEN2: SHR AL,1 MOV VAR1,AL SHR BL,1
6、 MOV VAR2,BL OVER: MOV AH,4CH MOV AL,0 INT 21H CODE ENDS END START 4.6、已知在字变量 VAR1、 VAR2 和 VAR3 中保存有 3 个相同的代码,但有一个错码,编写程序段找出这个错码,并将它送到 AX,其地址送 SI;如果 3 个代码都相同,则在 AX 中置 1 标志。 答 : 在数据段中定义: VAR1 DW 5A34H VAR2 DW 5A35H VAR3 DW 3A34H 在代码段中编写程序段 : MOV AX,-1 MOV BX,VAR1 CMP BX,VAR2 JZ L2 CMP BX,VAR3 JZ L1 M
7、OV AX,BX LEA SI,VAR1 JMP OVER L1: MOV AX,VAR2 LEA SI,VAR2 JMP OVER L2: CMP BX,VAR3 JZ OVER MOV AX,VAR3 LEA SI,VAR3 OVER: 4.7、分析下列程序段的功能 : MOV CL, 04 SHL DX, CL MOV BL, AH SHL AX, CL SHR BL, CL OR DL, BL 解:程序段完成 DX:AX 组成的 32 位无符号数左移 4 位,低位补零(也即除以 16)。 4.8、阅读下列程序段,指出它完成什么运算。 CMP AX, 0 JGE EXIT NEG AX
8、EXIT: 答:取 AX 的绝对值。 4.9、答:将 DX 中的值转换为相应的 ASCII 码字符存入 DISP 对应的 4 字节存储单元中。例如 DX=3F0BH,则在 DISP 中存放 3, F, 0, B。 4.10、答:将 FIRST 和 SECOND 数据相加,结果存入 FIRST 中, FIRST 中的结果为: 10H,61H, 01H。 4.11、答:将从 390H 端口读入的数据的低 4 位转换为对应 16 进制数的 ASCII 码,然后往390H 端口输出。例如读入的数据为 29H,则输出 9, 读入的数据 为 1BH,则输出 B。 4.12、答: 实际上完成 BX 内容循环
9、右移 2 位,因此, BX 寄存器的内容为 C02DH。 4.13、答: 完成 BX 内容逻辑右移 5 位,因此, BX 寄存器的内容为 03EAH。 4.14、答:( 1) AX=FFF3H, DX=FFFAH;( 2) AX=1FF2H, DX=0002H 4.15、答: AX=FFFCH, BX=200AH, CX=0008H, DX=2010H, SI=2000H 4.16、答: 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 D
10、I,2 LOOP L1 4.17、答: ENCRPYTION PROC NEAR LEA SI,ARRAY XOR DX,DX MOV AX,SI MOV BX,5 DIV BX MOV CX, AX ADD SI, 2 L1: MOV AX, SI XOR AX,0AAAAH MOV SI, AX ADD SI,10 LOOP L1 RET ENCRPYTION ENDP 4.18、 答: DATA SEGMENT ARRAY DB 12,28,128,35,46,69,120,89,93,100,112,125,200 DATA ENDS CODE SEGMENT ASSUME CS:CO
11、DE,DS:DATA START: MOV AX,DATA MOV DS,AX XOR CX,CX MOV CL,ARRAY ;数据个数存入 AX MOV SI,OFFSET ARRAY+1 ;SI 存放第一个数的偏移地址 XOR DX,DX XOR AX,AX ;AX 用来存放和,首先清零 XH: XOR BX,BX MOV BL,SI ADD AX,BX JNC BUYICHU ADD DX,1 BUYICHU:INC SI LOOP XH CMP DX,0 JZ OVER MOV DX,-1 OVER: HLT CODE ENDS END START 4.19、答 : 程序如下 : MO
12、V CX,N 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 4.20、 答 :设 BUFFER 中存放的是字节型数据。采用双指针方法: SI 为读指针, DI 为写指针,从低地址开始,内存
13、中读出一个字节,如果不为 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 4.21、答: MOV CX,N MOV BX,BUF1 MOV SI,0 MOV DI,OFFSET PRODUCT XH: MOV AX,BUFNSI PUSH AX MUL BX MOV DI,AX
14、;乘积低位字 ADD DI,2 MOV DI,DX ;乘积高位字 POP AX XOR DX,DX DIV BX MOV QUOTIENTSI,AX ;商 MOV REMAINDERSI,DX ;余数 ADD SI,2 LOOP XH 4.22、答: 统计 AL 中 1 的个数,只需将 AL 右移,移出的一位内容进行累加,子程序为: 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 在此基础上,可以检测
15、出字节型缓冲区 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 4.23、答: 4.24、答: 4.25、答 : ;产生 N 个 伪随机数 MOV CX,N MOV SI,OFFSET NUM XOR AH,AH MOV AL,23 XH: MOV SI,AL PUSH AX ADD AX,0 JNP FEIJ
16、ISHU INC CNT ADD SUMODD,AX FEIJISHU: POP AX ADD AL,17 INC SI LOOP XH 4.26、答: 4.27、答: 4.28、答: 4.29、答: 4.30、答: 4.31、答: 4.32、答: 4.33、答: STACK SEGMENT STACK STACK DW 100H DUP( ?) TOP LABEL BYTE STACK ENDS DATA SEGMENT BUFFER DB 3 ;首字节为字符串长度 DB ABC ;字符串 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DA
17、TA,SS:STACK START: MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AX,DATA 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 AND BL,01H JZ SETEVEN2 OR AL,80
18、H 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 4.34、答: MOV AX,SI2*N TEST AX,8000H JZ OVER MOV CX,N XH: MOV AX,SI NEG
19、AX MOV SI,AX ADD SI,2 LOOP XH OVER:NOP 4.35、答: 设奖斐波那契数列存放在字变量 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 4.36
20、、答 :在数据段中定义变量 : 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 INT 21H ADD SI,2 CALL WAIT LOOP L1 这里, WAIT 为延时子程序,用于在显示信息之间的停顿。 4.37、答: 先编写一个子程序 DISPALD,完成以 3 位十进制数形式显示出 AL 的内容。 DISPALD
21、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 INT 21H POP AX MOV DL,30H ADD DL,AH MOV AH,2 INT 21H POP DX POP CX POP AX RET DISPALD ENDP 在此基础上,根据题目要求, 需要用到
22、 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 LOOP L1 MOV AL,DL CALL DISPALD MOV AL,DH CALL DISPALD 4.38、答 :设 BUFFER 中存放的是有
23、符号数。 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 4.39、 答 : 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