《2022年微机原理与接口技术第四章习题解答 .pdf》由会员分享,可在线阅读,更多相关《2022年微机原理与接口技术第四章习题解答 .pdf(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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 倍。答:将扩大后的结果放在DX
2、 :AX 中,注意到10AX 8AX 2AX 。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,V ARSI CMP AX, V ARSI+2 JAE L1 XCHG AX
3、, 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: 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 48 页MOV VARSI+2, AX 4.4、编写程序段实现将AL 和 BL 中的每一位依次交叉,得到的16 位字保存在DX 中,例如( AL ) 01100101B, (BL ) 11011010B,则得到的(DX
4、) 10110110 10011001B。答:利用移位指令完成。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 与 VAR
5、2 内容交换;如果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,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,
6、AL SHR BL,1 MOV VAR2,BL OVER: MOV AH,4CH MOV AL,0 INT 21H 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 48 页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
7、 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 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: 4.7、分析下列程序段的功能:MOV CL , 04 SHL DX ,CL MOV BL , AH SHL AX ,CL SHR BL ,CL OR DL , BL 解:程序段完成DX:AX组成的 32 位无符号数左移4 位,低位补零
8、(也即除以16) 。4.8、阅读下列程序段,指出它完成什么运算。CMP AX, 0 JGE EXIT NEG AX EXIT: 答:取 AX 的绝对值。4.9、答:将 DX 中的值转换为相应的ASCII 码字符存入DISP 对应的 4 字节存储单元中。例如 DX=3F0BH ,则在 DISP 中存放 3, F, 0, B 。4.10、答:将 FIRST 和 SECOND 数据相加,结果存入FIRST 中, FIRST 中的结果为: 10H,精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 48 页61H,01H。4.11、答:将从390H
9、 端口读入的数据的低4 位转换为对应16 进制数的ASCII 码,然后往390H 端口输出。例如读入的数据为29H,则输出 9, 读入的数据为1BH,则输出 B。4.12、答:实际上完成BX 内容循环右移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,BUFFE
10、RS 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 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 SEGMEN
11、T ARRAY DB 12,28,128,35,46,69,120,89,93,100,112,125,200 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA START: MOV AX,DA TA 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 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4
12、页,共 48 页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、答:程序如下:MOV 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 中存
13、放的是有符号数,则只需要将程序中的两行内容修改:JBE NOCHG1 改成: JLE NOCHG1 JAE NOCHG2 改成: JGE NOCHG2 4.20、答:设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:
14、 INC SI LOOP L1 MOV BUFFER,BH 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 48 页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 ;乘积低位字ADD DI,2 MOV DI,DX ;乘积高位字POP AX XOR DX,DX DIV BX MOV QUOTIENTSI,AX ;商MOV REMAINDERSI,DX ;余数ADD SI,2 LOOP
15、 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 在此基础上,可以检测出字节型缓冲区BUF 中 0 和 1 个数相等的元素个数,即一个字节中有 4 个 1。设 BUF 中有 N 个字节型数据,结果保持在BH 中。MOV CX,N LEA SI, BUF XOR BH,BH L1: MOV AL,SI CAL
16、L 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 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 48 页MOV AL,23 XH: MOV SI,AL PUSH AX ADD AX,0 JNP FEIJISHU INC CNT ADD SUMODD,AX FEIJISHU: POP AX ADD AL,17 INC SI LOOP XH 4
17、.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:DATA,SS:STACK START: MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AX,DA TA MOV DS,AX MOV E
18、S,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 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 48 页PUSH CX PUSH DI SETEVEN1: MOV AL,DI CALL COUNTBYTE AND BL,01H JZ SETEVEN2 OR AL,80H MOV DI,AL SETEVEN2: IN
19、C 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 AX MOV SI,AX ADD SI,2 L
20、OOP XH OVER:NOP 4.35 、答:设奖斐波那契数列存放在字变量RESULT 中。在数据段中定义RESULT DW 100H DUP (?)在代码段中编写子程序FIBONACCI PROC NEAR XOR DI,DI MOV RESULTDI,1 ;前两个数为1 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 48 页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 LO
21、OP L1 RET FIBONACCI ENDP 4.36、答:在数据段中定义变量: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 位十进制数
22、形式显示出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 INT 21H POP AX 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 48 页MOV DL,30H ADD DL,
23、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 LOOP L1
24、 MOV AL,DL CALL DISPALD MOV AL,DH CALL DISPALD 4.38、答:设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 4.39 、答: BL 用于存放项数。STACK SEGMENT STACK STACK DW 100H DUP (?)TOP LABEL WORD STACK ENDS DATA SEGMENT DB 100H DUP (
25、?)DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 48 页START: 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: 4.40
26、、答:设数据段的段名为SEGNAME ,则有SEGINTODS MOCRO SEGNAME MOV AX, SEGNAME MOV DS,AX ENDM SEGINTOES MOCRO SEGNAME MOV AX, SEGNAME MOV ES,AX ENDM 4.41 、答:设输入字符串保存在BUFIN 中,则有:INSTR MACRO BUFIN MOV AH, 10 LEA DX, BUFIN INT 21H ENDM 应该注意, BUFIN 为键盘缓冲区, 应该满足格式要求,详见 INT 21H 的 10 号功能说明。4.42 、答: CRLF MACRO MOV AH, 02 MO
27、V DL, 10 INT 21H MOV DL, 13 INT 21H ENDM 4.43 、答:设 DF=0 (1)L1: MOV AL, SI MOV ES:DI, AL INC SI INC DI LOOP L1 (2)L1: MOV AL, SI INC SI 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 48 页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 4.44 、答:S
28、TR1 中有 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 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
29、L1 L2: 4.45 、答: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 4.46 、答:将缓冲区FIRST 中 100 个字节传送到SECOND 中。4.47 、答:在缓冲区STRING 中搜索非空格字符,如果有非空格则转到FOUND ,如果 200精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 48 页个单元中都是空格,则转到NOT_FOUND 。4.48
30、、答:设 DS 和 ES均指向字符串OLDS 和 NEWS 所在的段。CLD MOV CX,5 LEA SI,OLDS LEA DI,NEWS REPZ CMPSB JNZ NEW_LESS 4.49 、答:设 STRING 中的字符个数为N。MOV CX,N LEA SI,STRING MOV AL,5FH L1: AND SI,AL INC SI LOOP L1 4.50 、答:利用字符串操作指令比较方便,也可以采用循环完成。(1) TASK1 MOV CX, 50 MOV AL, 20H LEA DI, STUDENT_PRINT REP STOSB (2) TASK2 MOV CX,
31、9 MOV AL, _LEA DI, STUDENT_ADDR REPNZ SCASB JZ FOUND NOT_FOUND: FOUND: (3) TASK3 MOV CX, 9 MOV AL, _LEA DI, STUDENT_ADDR ADD DI, CX STD REPNZ SCASB JZ FOUND NOT_FOUND: FOUND: (4) TASK4 MOV CX, 30 MOV AL, 20H LEA DI, STUDENT_ NAME REPZ SCASB JNZ NOT_FOUND MOV CX, 50 MOV AL, *LEA DI, STUDENT_PRINT REP
32、 STOSB NOT_FOUND: (5) TASK5 MOV CX, 30 LEA SI, STUDENT_ NAME LEA DI, STUDENT_PRINT REP MOVSB LEA SI, STUDENT_ ADDR MOV CX, 9 REP MOVSB 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 48 页4.51 、答:4.52 、答:4.53 、答:4.54 、答:先讨论随机数产生方法,通常采用同余法:( )(1)mod1,2,3,x kax kbNkL可以产生0 到 N-1 之间的随机数,其中,(0)x称为种子
33、,且位于0 ,N-1 ,当(0)x取不同值是产生不同的随机数列。,a b为任意正整数,一般取小于N 的质数, N 越大随机性越好。这里我们可以进一步简化:取1a,这样就不需要进行乘法运算。种子相同,其产生的随机数序列是相同的,因此应该选择随机的种子,这一点很重要。我们这里采取读取机器时钟,取其百分之一秒值作为种子。程序如下:M=45 N=50 STACK SEGMENT DW 100H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT PARAA DB 23 PARAB DB 11 SCORE DB N*5 DUP(50) MEANSCORE DB N
34、 DUP(0) LEVEL DB 6 DUP(0) STR0 DB Total : ,2 DUP(?),0AH,0DH,$ STR1 DB LevleA: ,2 DUP(?),0AH,0DH,$ STR2 DB LevleB: ,2 DUP(?),0AH,0DH,$ STR3 DB LevleC: ,2 DUP(?),0AH,0DH,$ STR4 DB LevleD: ,2 DUP(?),0AH,0DH,$ STR5 DB LevleE: ,2 DUP(?),0AH,0DH,$ STR6 DB LevleF: ,2 DUP(?),0AH,0DH,$ DATA ENDS CODE SEGMENT
35、 ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SP,TOP ; Input score data MOV AH,2CH INT 21H SEED: CMP DL,N JBE BELOW SUB DL,N 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 48 页JMP SEED BELOW: MOV AL,DL MOV CX,M*5 LEA SI,SCORE MOV BL
36、,PARAA XOR DX,DX MOV DL,PARAB LP: ADD SI,AL INC SI MUL BL ADD AX,DX LP1: CMP AX,N JB BELOW1 SUB AX,N JMP LP1 BELOW1: LOOP LP ; Computing mean score for every student MOV CX,M LEA SI,SCORE LEA DI,MEANSCORE MOV BL,5 LP2: XOR AX,AX PUSH CX MOV CX,5 LP3: ADD AL,SI ADC AH,0 INC SI LOOP LP3 DIV BL MOV DI,
37、AL INC DI POP CX LOOP LP2 ; Counting levels LEA SI,MEANSCORE MOV CX,M LP4: MOV AL,SI CMP AL,90 JB LEVELA INC LEVEL JMP LP5 LEVELA: CMP AL,80 JB LEVELB INC LEVEL+1 JMP LP5 LEVELB: CMP AL,70 JB LEVELC 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 48 页INC LEVEL+2 JMP LP5 LEVELC: CMP AL,66 JB LE
38、VELD INC LEVEL+3 JMP LP5 LEVELD: CMP AL,60 JB LEVELE INC LEVEL+4 JMP LP5 LEVELE: INC LEVEL+5 LP5: INC SI LOOP LP4 ; Display the result MOV AL,M CALL TRANS MOV STR0+8,AL MOV STR0+9,AH MOV AH,9 LEA DX, STR0 INT 21H MOV CX,6 LEA BX,STR1 LEA SI,LEVEL LP6: MOV AL,SI INC SI CALL TRANS MOV BX+8,AL MOV BX+9
39、,AH MOV AH,9 MOV DX,BX INT 21H ADD BX,13 LOOP LP6 MOV AH,4CH ;Return to DOS MOV AL,0 INT 21H TRANS PROC NEAR PUSH BX MOV BL,10 XOR AH,AH DIV BL ADD AX,3030H POP BX RET TRANS ENDP CODE ENDS END START 4.55、答:程序的编程思路为:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 48 页程序共 5 个功能,可采用跳转表法来实现多路分支结构程
40、序设计。现将这5 个程序段,各程序段的首地址分别标号为G1, G2, G3, G4, G5。 将 5 个程序段的入口地址做成表TABLE放入数据段,程序根据给定的参数计算出欲转入的程序段的首地址在TABLE 中的位置后,取出该地址,跳转至该程序段。首先,通过调用子程序MENU ,设置显示器,并输出提示文档。接着,读取 1 - 5 之间的 ASCII 表示数。然后,通过跳转表TABLE 实现由输入参数转入相应的程序段。由于表中按“字”存放数据,则每个数据的位移量是:0、2、4、6、8。对于输入参数N,计算位移量的公式是N=(N-1)*2 。当输入 1 时,跳转到标号G1。调用子程序CHGLTR
41、,完成将输入字符串中的小写字母变换成大写字母。用户按键,若为ESC ,则转到主程序段首调用MENU ,否则,转到标号G1 ;当输入 2 时,跳转到标号G2。调用子程序MAXLTR ,完成在输入字符串中找最大值。用户按键,若为ESC ,则转到主程序段首调用MENU ,否则,转到标号G2 ;当输入 3 时,跳转到标号G3。调用子程序SORTNUM ,完成输入数据组的排序。用户按键,若为ESC ,则转到主程序段首调用MENU ,否则,转到标号G3 。当输入 4 时,跳转到标号G4。调用子程序TIMCHK ,完成时间的显示。用户按键,若为 ESC ,则转到主程序段首调用MENU ,否则,转到标号G4
42、。当输入 5 时,跳转到标号G5。结束程序的运行,返回操作系统。程序流程框图见图4-1。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 48 页图 4-1 主程序流程框图START 初始化调用子程序MENU设置光标位置(41,10)带回显的控制台输入(AL) 输入字符(AL) 5将跳转表TABLE的偏移地址送入 (BX) (AL) (AL) 1(AL) (AL) * 2 AL 按符号扩展成AX (BX) TABLE (BX) (BX) + (AX) A B C E END D N=1 N=2 N=3 N=4 N=5 N N Y Y 精
43、选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 48 页子程序 MENU 的编程思路:设置显示器显示方式为80*25 彩色文本方式, 清屏。 逐行设置光标位置,使提示文档左对齐整体居中。输出1-5 的提示文档,再输出输入N 的提示。其流程框图见图4-2。图 4-1(续)主程序流程框图调用子程序MAXLTR带回显的控制台输入(AL) 输入字符B E (AL) = ESC ? Y N 调用子程序TIMCHK带回显的控制台输入(AL) 输入字符D E (AL) = ESC ? Y N 调用子程序SORTNUM带回显的控制台输入(AL) 输入字
44、符C E (AL) = ESC ? Y N 调用子程序CHGLTR带回显的控制台输入(AL) 输入字符A E (AL) = ESC ? Y N 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 48 页子程序 CHGLTR 的编程思路:设置显示器显示方式为80*25 彩色文本方式, 清屏。 设置光标位置, 使提示文档左对齐整体居中。输出输入字符串提示文档,读取输入字符串并将其放入KEYBUF 。在输入字符串尾加结束标志$,输出输入字符串。从前往后,依次取字符串中的每个字符,若其为小写字母,则将其ASCII 码减去 20H。输出变换后的字
45、符串。最后输出说明文档。其流程框图见图4-3。图 4-2 子程序 MENU 流程框图START 初始化清屏设置光标位置(5,5)显示提示字符串STRING1 设置光标位置(5,6)显示提示字符串STRING2 M 设置光标位置(5,7)显示提示字符串STRING3 设置光标位置(5,8)显示提示字符串STRING4 M N 设置光标位置(5,9)显示提示字符串STRING5 设置光标位置(5,10)显示提示字符串子程序 MENU 返回N 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 20 页,共 48 页精选学习资料 - - - - - - -
46、- - 名师归纳总结 - - - - - - -第 21 页,共 48 页子程序 MAXLTR的编程思路:设置显示器显示方式为80*25 彩色文本方式, 清屏。 设置光标位置, 使提示文档左对齐整体居中。输出输入字符串提示文档,读取输入字符串并将其放入KEYBUF 。在输入字符串尾加结束标志$,输出输入字符串。预设字符串中最大值为0。从前往后,依次取字符串中的每个字符,若其大于当前最大值,则进行替换,即可得到字符串中的最大值,并输出。最后输出说明文档。其流程框图见图3-4。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 22 页,共 48 页精选学
47、习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 23 页,共 48 页子程序 SORTNUM 的编程思路:设置显示器显示方式为80*25 彩色文本方式, 清屏。 设置光标位置, 使提示文档左对齐整体居中。输出输入数据组提示文档,读取输入数据组字符串并将其放入KEYBUF 。调用子程序CIN_INT ,将字符串转换成数据串。判断数据串是否有错误或者为空,若是,则重新输入数据组。调用子程序MPSORT,采用冒泡法对数据串进行排序。再调用子程序INT_OUT ,输出排序后的数据组。最后输出说明文档。其流程框图见图4-5。子程序 CIN_INT 的编程思路:入口
48、参数为:无;出口参数为:AL (有无错误标志,0 为有, 1 为无)。从前往后,依精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 24 页,共 48 页次取字符串中的每个字符进行判断。CH 表示数据组数据个数,AL 表示当前数据x,DL 作为有无数据标志。若当前字符为空格,则转到ADDNUM ,判断DL 是否为 1,若为 1,则CH 增 1,调用子程序ADDNEW ,增加新数x,然后 DL 、AL 清零;否则判断当前字符c是否在 0 - 9 之间,若不是,则判错,将AL 置 0,子程序CIN_INT 返回;否则, DL 置 1,x=x*10+c-
49、0 ,判断 x 是否超过255,若是,则判错,将AL 置 0,子程序CIN_INT返回;否则, 对下一个字符进行操作。字符串判断结束后,若 DL 为 1,则有新数 x 未加至数据组,调用子程序ADDNEW ,增加新数x。将数据组个数CH 放入 NUMBUF ,将 AL 置 1。其流程框图见图4-6。子程序 ADDNEW的编程思路:入口参数为:CH(数据组数据个数) 、AL (当前数据x) ;出口参数为:无。取出数据组 NUMBUF 的首地址,加上数据组数据个数,即为当前数据x 的地址,将x 放入该地址。其流程框图见图4-7。精选学习资料 - - - - - - - - - 名师归纳总结 - -
50、 - - - - -第 25 页,共 48 页精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 26 页,共 48 页子程序 MPSORT 的编程思路:对 N 个数据进行从小到大排序,采用“冒泡法”:从前往后,每两个数据进行比较,当前者大于后者时,交换两者的次序;否则不变。经过N-1 次比较,可以将最大值交换到第N 个单元。接着对前N-1 个数据,重复上述过程,使次大值交换到第N-1 个单元;依此类推,若某次比较过程,无任何交换,则终止其后的所有比较过程。最多进行N-1 次比较过程,可以完成数据的排序操作。其流程图见图4-8。子程序 IN_OUT 的