第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: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,VAR[SI] CMP AX, VAR[SI+2] JAE L1
XCHG AX, VAR[SI+2] L1:
CMP AX, VAR[SI+4] JAE L2
XCHG AX, VAR[SI+4] L2:
MOV VAR[SI], AX MOV AX,VAR[SI+2] CMP AX, VAR[SI+4] JAE L3
XCHG AX, VAR[SI+4] L3:
MOV VAR[SI+2], AX
4。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 SHR BL,1 RCR DX,1 LOOP L1
4.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, 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 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
MOV 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 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内容循环右移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 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 SEGMENT
ARRAY DB 12,28,128,35,46,69,120,,93,100,112,125,200 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,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、答:程序如下:
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中存放的是有符号数,则只需要将程序中的两行内容修改:
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:
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,BUFN[SI] PUSH AX MUL BX
MOV [DI],AX ;乘积低位字 ADD DI,2 MOV [DI],DX ;乘积高位字 POP AX
XOR DX,DX DIV BX
MOV QUOTIENT[SI],AX ;商 MOV REMAINDER[SI],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
在此基础上,可以检测出字节型缓冲区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 FEIJISHU 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:DATA,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,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
4。34、答:
MOV AX,SI[2*N] TEST AX,8000H JZ OVER MOV CX,N
XH: MOV AX,[SI] NEG 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 RESULT[DI],1 ;前两个数为1
MOV RESULT[DI+2],1
ADD DI,4 MOV CX,N
L1:
MOV AX, RESULT[DI-4] ADD AX, RESULT[DI—2] MOV RESULT[DI],AX ADD DI,2 LOOP L1 RET
FIBONACCI ENDP
4.36、答:在数据段中定义变量:
TABLE DW INFORM1, INFORM2, INFORM3, INFORM4, INFORM5 DW INFORM6, INFORM7, INFORM8, INFORM9, INFORM10 在代码段中编写程序段: L1:
MOV CX,10
XOR SI,SI MOV DX,TABLE[SI] MOV AH,9 INT 21H ADD SI,2 CALL WAIT LOOP L1
这里,WAIT为延时子程序,用于在显示信息之间的停顿.
4.37、答:先编写一个子程序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 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.
L1: L2: L3: L1:
MOV XOR LEA LEA LEA MOV AND JS MOV INC INC JMP MOV INC INC INC LOOP MOV CALL MOV CALL
CX,20 DX,DX SI,ARRAY DI,ARRAYP BX,ARRAYN AL,[SI] AL,AL L2
[DI],AL DI DL L3
[BX],AL BX DH SI L1
AL,DL DISPALD AL,DH DISPALD
4。38、答:设BUFFER中存放的是有符号数。
MOV CX,100 LEA SI,BUFFER MOV AX, 7FFFH 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,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、答:设数据段的段名为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
SS:STACK 应该注意,BUFIN为键盘缓冲区,应该满足格式要求,详见INT 21H的10号功能说明. 4。42、答:CRLF MOV MOV INT MOV INT ENDM 4.43、答:设DF=0 (1) L1: (2) (3) (4)
MOV AL, [SI]
MOV ES:[DI], AL INC SI INC DI LOOP L1
L1: MOV AL, [SI] INC SI LOOP L1 L1: MOV ES:[DI], AL INC DI LOOP L1
L1: MOV AL, [SI] CMP AL, ES:[DI] INC SI INC DI LOOP L1
MACRO
AH, 02 DL, 10 21H
DL, 13 21H
4。44、答: 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 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:
4.45、答: STRING中保存了30个字符。 L1: L2:
4.46、答:将缓冲区FIRST中100个字节传送到SECOND中。
4.47、答:在缓冲区STRING中搜索非空格字符,如果有非空格则转到FOUND,如果200个单元中都是空格,则转到NOT_FOUND。
4.48、答:设DS和ES均指向字符串OLDS和NEWS所在的段。
CLD MOV LEA LEA REPZ JNZ
CX,5
SI,OLDS DI,NEWS CMPSB NEW_LESS
MOV CX,30 LEA SI,STRING MOV AL,’&’ CMP [SI],AL JNZ L2
MOV BYTE PTR [SI],'/’ INC SI LOOP L1
4.49、答:设STRING中的字符个数为N。 L1:
MOV CX,N
LEA SI,STRING MOV AL,5FH AND [SI],AL INC SI LOOP L1
MOV CX, 50 MOV AL, 20H LEA DI, STUDENT_PRINT REP STOSB MOV CX, 9 MOV AL, ‘_’ LEA DI, STUDENT_ADDR REPNZ SCASB JZ FOUND …… ……
MOV CX, 9 MOV AL, ‘_’ LEA DI, STUDENT_ADDR ADD DI, CX STD
REPNZ SCASB
4。50、答:利用字符串操作指令比较方便,也可以采用循环完成.
(1) TASK1 (2) TASK2 NOT_FOUND: FOUND: (3) TASK3
NOT_FOUND: FOUND: (4) TASK4 NOT_FOUND: (5) TASK5
JZ FOUND
…… ……
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 STOSB ……
MOV CX, 30 LEA SI, STUDENT_ NAME LEA DI, STUDENT_PRINT REP MOVSB LEA SI, STUDENT_ ADDR MOV CX, 9 REP MOVSB
4.51、答: 4.52、答: 4.53、答:
4。、答:先讨论随机数产生方法,通常采用同余法:
x(k)ax(k1)bmodNk1,2,3,,
可以产生0到N-1之间的随机数,其中,x(0)称为种子,且位于[0,N—1],当x(0)取不同值是产生不同的随机数列。a,b为任意正整数,一般取小于N的质数,N越大随机性越好。这里我们可以进一步简化:取a1,这样就不需要进行乘法运算。
种子相同,其产生的随机数序列是相同的,因此应该选择随机的种子,这一点很重要。
我们这里采取读取机器时钟,取其百分之一秒值作为种子.
程序如下:
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 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
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 JMP SEED BELOW:
MOV AL,DL MOV CX,M*5 LEA SI,SCORE MOV BL,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],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 INC LEVEL+2 JMP LP5 LEVELC: CMP AL,66 JB LEVELD 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],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、答:程序的编程思路为:
程序共5个功能,可采用跳转表法来实现多路分支结构程序设计.现将这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,完成将输入字符串中的小写字母变换成大写字母。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G1;
当输入‘2’时,跳转到标号G2。调用子程序MAXLTR,完成在输入字符串中找最大值。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G2;
当输入‘3'时,跳转到标号G3。调用子程序SORTNUM,完成输入数据组的排序。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G3。
当输入‘4’时,跳转到标号G4。调用子程序TIMCHK,完成时间的显示。用户按键,若
为ESC,则转到主程序段首调用MENU,否则,转到标号G4。
当输入‘5’时,跳转到标号G5。结束程序的运行,返回操作系统。 程序流程框图见图4-1。
START 初始化 E 调用子程序MENU 设置光标位置(41,10) 带回显的控制台输入 (AL) ← 输入字符 Y (AL) < ‘1’ N (AL) > ‘5’ N 将跳转表TABLE的偏移地址送入(BX) (AL) ← (AL) – ‘1’ (AL) ← (AL) * 2 AL按符号扩展成AX (BX) ← TABLE (BX) ← (BX) + (AX) Y N=1 A B N=2 N=5 C N=3 D N=4 END 图4-1 主程序流程框图
A 调用子程序CHGLTR 带回显的控制台输入 (AL) ← 输入字符 N B 调用子程序MAXLTR 带回显的控制台输入 (AL) ← 输入字符 N (AL) = ESC ? Y E C 调用子程序SORTNUM 带回显的控制台输入 (AL) ← 输入字符 (AL) = ESC ? Y E D 调用子程序TIMCHK 带回显的控制台输入 (AL) ← 输入字符 (AL) = ESC ? Y E N (AL) = ESC ? Y E N 图4-1(续) 主程序流程框图
子程序MENU的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。逐行设置光标位置,使提示文档左对齐整体居中。输出1-5的提示文档,再输出输入N的提示。其流程框图见图4—2。
START 初始化 清屏 设置光标位置(5,5) 显示提示字符串STRING1 设置光标位置(5,6) 显示提示字符串STRING2 M 设置光标位置(5,7) 显示提示字符串STRING3 设置光标位置(5,8) 显示提示字符串STRING4 N 设置光标位置(5,9) 显示提示字符串STRING5 设置光标位置(5,10) 显示提示字符串子程序MENU返回 N M 图4-2 子程序MENU流程框图
子程序CHGLTR的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。设置光标位置,使提示文档左对齐整体居中。输出输入字符串提示文档,读取输入字符串并将其放入KEYBUF。在输入字符串尾加结束标志$,输出输入字符串。从前往后,依次取字符串中的每个字符,若其为小写字母,则将其ASCII码减去20H。输出变换后的字符串。最后输出说明文档。
其流程框图见图4—3。
子程序MAXLTR的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。设置光标位置,使提示文档左对齐整体居中。输出输入字符串提示文档,读取输入字符串并将其放入KEYBUF。在输入字符串尾加结束标志$,输出输入字符串.预设字符串中最大值为0.从前往后,依次取字符串中的每个字符,若其大于当前最大值,则进行替换,即可得到字符串中的最大值,并输出。最后输出说明文档。
其流程框图见图3—4。
子程序SORTNUM的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏.设置光标位置,使提示文档左对齐整体居中。输出输入数据组提示文档,读取输入数据组字符串并将其放入KEYBUF。调用子程序CIN_INT,将字符串转换成数据串.判断数据串是否有错误或者为空,若是,则重新输入数据组。调用子程序MPSORT,采用冒泡法对数据串进行排序。再调用子程序INT_OUT,输出排序后的数据组。最后输出说明文档。
其流程框图见图4-5。
子程序CIN_INT的编程思路:
入口参数为:无;出口参数为:AL(有无错误标志,0为有,1为无)。从前往后,依次取
字符串中的每个字符进行判断。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-‘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。
子程序MPSORT的编程思路:
对N个数据进行从小到大排序,采用“冒泡法\":从前往后,每两个数据进行比较,当前者大于后者时,交换两者的次序;否则不变。经过N—1次比较,可以将最大值交换到第N个单元.接着对前N-1个数据,重复上述过程,使次大值交换到第N—1个单元;依此类推,若某次比较过程,无任何交换,则终止其后的所有比较过程.最多进行N-1次比较过程,可以完成数据的排序操作. 其流程图见图4—8。 子程序IN_OUT的编程思路:
从数据组中依次取出每个数据,调用OUTNUM,将十进制数据转成十六进制进行输出,数据之间输出一个空格作为分隔符。 其流程图见图4—9。
START (AL) ← (NUMBUF) Y (AL) ≤1 N AL按符号扩展成AX (CX) ← (AX) (SI) ← NUMBUF (SI) ← (SI) + (CX) (CX) ← (CX) – 1 CX、SI进栈 (DL) ← 0 (AL) ← ((SI)) (AL) ≥ ((SI)–1) N (AL) ←→ ((SI–1)) ((SI)) ← (AL) (DL) ← 1 (SI) ← (SI) - 1 Y (CX) ← (CX) – 1 (CX) = 0 ? Y SI、CX出栈 N (DL) = 1 ? Y N (CX) ← (CX) – 1 (CX) = 0 ? 图3-8 子程序MPSORT流程框图 N Y 子程序MPSORT返回
START 初始化 (AL) ← (NUMBUF) AL按符号扩展成AX (CX) ← (AX) (BL) ← 10H (SI) ← NUMBUF + 1 (AL) ← ((SI)) 调用子程序OUTNUM (SI) ← (SI) + 1 显示字符‘ ’ (CX) ← (CX) – 1 (CX) = 0 ? Y 子程序INT_OUT返回 图3-9 子程序INT_OUT流程框图 N
START 初始化 (AH) ← 0 (AX)/(BL) → 商(AL),余(AH) AX进栈 Y (AH) < 10 N (AH) ← (AH)+7 (AH) ← (AH)+30H (DL) ← (AH) AX出栈,DX进栈 (AL) = 0 ? N 调用子程序OUTNUM DX出栈 显示字符(DL) 子程序OUTNUM返回 Y 图3-10 子程序OUTNUM流程框图
子程序OUTNUM的编程思路:
入口参数:AL(待转换的数据),BL(转换进制数);出口参数:无。待转换数据x除以转换进制数,商为新的x,余数y为转换后的低位。保存y,调用子程序OUTNUM本身,对新的x进行进制转换并输入。取出y,对其进行输入,若低于10,则直接输出,否则转换成字母输出。
其流程图见图3—10. 子程序TIMCHK的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏。设置光标位置,输出设置时间提示文档。读取输入时间字符串并将其放入KEYBUF。分别判断时、分、秒是否在有效数字范围,若有效,则设置新的系统时间。调用子程序TIME,在屏幕的右上角实时显示时间。
其流程框图见图3-11。 START 初始化 清屏 设置光标位置(5,6) 显示提示字符串IN_TIM KEYBUF ← 输入字符串 (AL) ← 输入字符串的1-2位数值(时) Y (AL)<0或N (CH) ← (AL) F (AL) ← 输入字符串的4-5位数值(分) Y (AL)<0或N (CL) ← (AL) F (AL) ← 输入字符串的7-8位数值(秒) Y (AL)<0或N (DH) ← (AL) (DL) ← 0 置系统时间 F F 调用子程序TIME 子程序TIMCHK返回 图3-11 子程序TIMCHK流程框图
START 初始化 清屏 设置光标位置(10,9) 显示提示字符串HINSTR 设置光标位置(72,0) 取系统时间 (AL) ← (CH) 调用子程序SHOWNUM 显示字符‘:’ (AL) ← (CL) 调用子程序SHOWNUM 显示字符‘:’ (AL) ← (DH) 调用子程序SHOWNUM 设置光标位置(10,9) (BX) ← 0018H (CX) ← 0 (CX) ← (CX) – 1 (CX) = 0 ? N (BX) ← (BX) – 1 Y Y (BX) ≠ 0 ? N 检查键盘状态 Y AL = 0 ? N 子程序TIME返回 图3-12 子程序TIME流程框图
START 初始化 AL按符号扩展成AX CX、DX进栈 (CL) ← 10 (AX)/(BL) → 商(AL),余(AH) (AH) → (AH)+ ‘0’ (BH) → (AH) (AL) → (AL)+ ‘0’ 显示字符(AL)、(BH) DX、CX出栈 子程序SHOWNUM返回 图3-13 子程序SHOWNUM流程框图
子程序TIME的编程思路:
设置显示器显示方式为80*25彩色文本方式,清屏.设置光标位置,输出说明文档。实时显示时间:设置光标至屏幕右上角;读取系统时间,调用子程序SHOWNUM分别对时、分、秒进行显示,并用‘:’作分隔符;设置光标等待位置,并进行延时;检查键盘状态,若无键盘输入,则重复上述步骤显示时间,否则子程序TIME返回。 其流程框图见图3-12。 子程序SHOWNUM的编程思路:
入口参数:AL(待显示的数据);出口参数:无。待显示数据x除以10,商为y,余数为z.将数字y、z分别转换成字符数字,然后输出。其流程框图见图3—13。
四、程序代码
STACK SEGMENT STACK DB 256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT TABLE DW G1, G2, G3, G4, G5 STRING1 DB ’1. Change small letters into capital letters of string;’, 0DH, 0AH, ’$’ STRING2 DB ’2。 Find the maximum of string;’, 0DH, 0AH, ’$’ STRING3 DB '3。 Sort for datas;', 0DH, 0AH, ’$’
STRING4 DB ’4。 Show Time;', 0DH, 0AH, ’$’ STRING5 DB ’5。 Exit.’, 0DH, 0AH, '$'
STRINGN DB 'Input the number you select (1-5) : $'
IN_STR DB ’Input the string (including letters & numbers, less than 60 letters) :’, 0DH, 0AH, ’$’ PRESTR DB ’Original string : $’ NEWSTR DB ’New string : $’ OUT_STR DB 'The string is $’ MAXCHR DB ’The maximum is $’ IN_NUM DB 'Input the numbers (0 — 255, no more than 20 numbers) : ', 0DH, 0AH, ’$' OUT_NUM DB 'Sorted numbers : ', 0DH, 0AH, ’$' IN_TIM DB 'Correct the time (HH:MM:SS) : $’ HINTSTR DB 'Press ESC, go back to the menu; or press any key to play again!$’ KEYBUF DB 61 DB ? DB 61 DUP (?) NUMBUF DB ? DB 20 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP MAIN: CALL FAR PTR MENU ; 设置显示器 AGAIN: MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 41 ; 列号 MOV DH, 10 ; 行号 INT 10H ; 光标位置设置 MOV AH, 1 INT 21H CMP AL, ’1’ JB AGAIN CMP AL, '5’ JA AGAIN SUB AL, '1' ; N—1 SHL AL, 1 ; (N—1)*2 CBW ; AL—>AX LEA BX, TABLE ADD BX, AX JMP WORD PTR [BX] G1: CALL FAR PTR CHGLTR MOV AH, 8 INT 21H CMP AL, 1BH JZ MAIN JMP G1
G2: G3: CALL FAR PTR MAXLTR
MOV AH, 8 INT 21H
CMP AL, 1BH JZ MAIN JMP G2
CALL FAR PTR SORTNUM MOV AH, 8 INT 21H
CMP AL, 1BH JZ MAIN JMP G3
G4: CALL FAR PTR TIMCHK MOV AH, 8 INT 21H
CMP AL, 1BH JZ MAIN JMP G4
G5: MOV AH, 4CH INT 21H
MENU PROC FAR
;设置显示器方式 MOV AH, 0 MOV AL, 3; MOV BL, 0; INT 10H MOV AH, 2 MOV BH, 0 MOV DL, 5 MOV DH, 5 INT 10H
MOV AH, 9
LEA DX, STRING1 INT 21H
MOV AH, 2 MOV DL, 5 MOV DH, 6 INT 10H MOV AH, 9
LEA DX, STRING2 INT 21H MOV AH, 2 MOV DL, 5 MOV DH, 7 INT 10H MOV AH, 9
LEA DX, STRING3 INT 21H
MOV AH, 2
; 显示主界面
; 清屏 ; 页号 ; 列号 ; 行号
; 光标位置设置
; 列号 ; 行号
; 光标位置设置; 列号 ; 行号
; 光标位置设置
MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRING4 INT 21H MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRING5 INT 21H MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 10 ; 行号 INT 10H ; 光标位置设置 MOV AH, 9 LEA DX, STRINGN INT 21H RET MENU ENDP CHGLTR PROC FAR ; 将输入字符串中小写字母便换成大写字母 RECHG: ;设置显示器方式 MOV AH, 0 MOV AL, 3 MOV BL, 0 INT 10H ; 清屏 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 输入提示光标位置设置 MOV AH, 9 LEA DX, IN_STR INT 21H ; 输入字符串提示 MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 输入字符串光标位置设置 MOV AH, 0AH LEA DX, KEYBUF INT 21H ; 输入字符串 CMP KEYBUF + 1, 0 JZ RECHG ; 判断输入字符串是否为空串 LEA BX, KEYBUF + 2 MOV AL, KEYBUF + 1 CBW MOV CX, AX ADD BX, AX MOV BYTE PTR [BX], '$’ ; 在输入字符串尾加结束标志$
MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 源字符串提示光标位置设置 MOV AH, 9 LEA DX, PRESTR INT 21H ; 输出源字符串提示 MOV AH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出源字符串 LEA BX, KEYBUF + 2 LCHG: CMP BYTE PTR [BX], 61H JB NOCHG AND BYTE PTR [BX], 0DFH NOCHG: INC BX LOOP LCHG ; 将字符串中小写字母转换成大写字母 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 新字符串提示光标位置设置 MOV AH, 9 LEA DX, NEWSTR INT 21H ; 输出新字符串提示 MOV AH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出新字符串 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOV AH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 RET CHGLTR ENDP MAXLTR PROC FAR ; 在输入字符串中找出最大值 REMAX: ;设置显示器方式 MOV AH, 0 MOV AL, 3 MOV BL, 0 INT 10H ; 清屏 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 输入提示光标位置设置
MOV AH, 9 LEA DX, IN_STR INT 21H ; 输入字符串提示 MOV AH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 输入字符串光标位置设置 MOV AH, 0AH LEA DX, KEYBUF INT 21H ; 输入字符串 CMP KEYBUF + 1, 0 JZ REMAX ; 判断输入字符串是否为空串 LEA BX, KEYBUF + 2 MOV AL, KEYBUF + 1 CBW MOV CX, AX ADD BX, AX MOV BYTE PTR [BX], '$’ ; 在输入字符串位加结束标志$ MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 源字符串提示光标位置设置 MOV AH, 9 LEA DX, OUT_STR INT 21H ; 输出字符串提示 MOV AH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出字符串 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 新字符串提示光标位置设置 MOV AH, 9 LEA DX, MAXCHR INT 21H ; 输出字符串中最大值提示 MOV DL, 0 LEA BX, KEYBUF + 2 LCMP: CMP [BX], DL JB NOLCHG MOV DL, [BX] NOLCHG: INC BX LOOP LCMP ; 找出字符串中最大字符,放入DL MOV AH, 2 INT 21H ; 输出字符串中最大字符 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号
INT 10H MOV AH, 9 LEA DX, HINTSTR INT 21H RET MAXLTR ENDP
SORTNUM PROC FAR RESORT: ;设置显示器方式 MOV AH, 0 MOV AL, 3 MOV BL, 0 INT 10H MOV AH, 2 MOV BH, 0 MOV DL, 5 MOV DH, 5 INT 10H MOV AH, 9 LEA DX, IN_NUM INT 21H MOV AH, 2 MOV DL, 5 MOV DH, 6 INT 10H MOV AH, 0AH LEA DX, KEYBUF INT 21H CALL CIN_INT CMP AL, 0 JZ RESORT CMP NUMBUF, 0 JZ RESORT MOV AH, 2 MOV BH, 0 MOV DL, 5 MOV DH, 7 INT 10H MOV AH, 9 LEA DX, OUT_NUM INT 21H MOV AH, 2 MOV BH, 0 MOV DL, 5 MOV DH, 8 INT 10H CALL FAR PTR MPSORT CALL FAR PTR INT_OUT MOV AH, 2 MOV BH, 0
; 提示信息光标位置设置
; 输出提示信息 ; 对输入数据组排序
; 清屏
; 页号
; 列号 ; 行号
; 输入提示光标位置设置
; 列号 ; 行号
; 输入数据组光标位置设置
; 输入数据组字符串 ; 字符串转换成数据串 ; 判断数据串是否有错 ; 判断数据串是否为空
; 页号 ; 列号 ; 行号
; 输出提示光标位置设置
; 输出数据串提示 ; 页号 ; 列号 ; 行号
; 输出数据组光标位置设置 ; 数据组排序 ; 数据组的输出 ; 页号
MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOV AH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 RET
SORTNUM ENDP CIN_INT PROC NEAR ; 读入整型数 ; 入口参数:无
; 出口参数为:AL(有无错误标志,0为有,1为无) MOV CL, KEYBUF + 1 LEA SI, KEYBUF + 2 MOV CH, 0 ; 数据组数据个数置0 MOV DH, 10 MOV AL, 0 ; 当前数据x=0 MOV DL, 0 ; 有无数据标志置0,即无数据 FNDNUM: CMP BYTE PTR [SI], ' ' JZ ADDNUM ; 判断当前字符是否为空格 CMP BYTE PTR [SI], ’0’ JB ERRNUM CMP BYTE PTR [SI], ’9' JA ERRNUM ; 判断当前字符是否在’0’—’9'之间 MOV DL, 1 ; 有无数据标志置1,即有数据 MUL DH XOR BH, BH MOV BL, [SI] ADD AX, BX SUB AX, ’0’ ; 计算出当前数据x CMP AH, 0 JA ERRNUM ; 判断x是否越界 JMP NEXT ADDNUM: CMP DL, 1 JNZ NEXT ; 判断是否有数据 INC CH ; 数据组数据个数加1 CALL ADDNEW MOV DL, 0 MOV AL, 0 ; 清零 NEXT: INC SI DEC CL CMP CL, 0 JNZ FNDNUM ; 依次检查各字符 CMP DL, 1 JNZ TOTAL ; 判断是否有未加入的数据 INC CH CALL ADDNEW TOTAL: MOV NUMBUF, CH ; 置数据组数据个数 MOV AL, 1 ; 输入数据无错误
JMP CRTNUM ERRNUM: MOV AL, 0 ; 输入数据有错误 CRTNUM: RET CIN_INT ENDP
ADDNEW PROC NEAR ; 增加新数
; 入口参数:CH(数据组数据个数)、AL(当前数据x) ; 出口参数:无 PUSH AX LEA BX, NUMBUF MOV AL, CH CBW ADD BX, AX POP AX MOV [BX], AL RET ADDNEW ENDP MPSORT PROC FAR MOV AL, NUMBUF CMP AL, 1 JBE NOSORT CBW MOV CX, AX LEA SI, NUMBUF ADD SI, CX DEC CX LP1: PUSH CX PUSH SI MOV DL, 0 LP2: MOV AL, [SI] CMP AL, [SI - 1] JAE NOXCHG XCHG AL, [SI - 1] MOV [SI], AL MOV DL, 1 NOXCHG: DEC SI LOOP LP2 POP SI POP CX CMP DL, 1 JNZ NOSORT LOOP LP1 NOSORT:RET MPSORT ENDP INT_OUT PROC FAR MOV AL, NUMBUF CBW MOV CX, AX MOV BL, 10H LEA SI, NUMBUF + 1
; 数据组排序 ; 若只有一个元素,停止排序; SI指向数据组首地址 ; SI指向数据组末地址 ; 外循环次数 ; 外循环开始 ; 交换标志置0 ; 内循环开始 ; 交换操作 ; 交换标志置1 ; 判断交换标志 ; 输出数据组 PRINT: MOV AL, [SI] CALL OUTNUM INC SI MOV AH, 2 MOV DL, ' ' INT 21H LOOP PRINT RET INT_OUT ENDP
OUTNUM PROC NEAR ; 将十进制数以十六进制输出 ; 入口参数:AL(待转换的数据),BL(转换进制数16) ; 出口参数:无 MOV AH, 0 DIV BL PUSH AX CMP AH, 10 JB PNUM ADD AH, 7 PNUM: ADD AH, 30H MOV DL, AH POP AX PUSH DX CMP AL, 0 JZ OUTN CALL OUTNUM OUTN: POP DX MOV AH, 2 INT 21H RET
OUTNUM ENDP TIMCHK PROC FAR ; 设定并显示时间 ;设置显示器方式 MOV AH, 0 MOV AL, 3; MOV BL, 0; INT 10H ; 清屏 MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 设置提示光标位置设置 MOV AH, 9 LEA DX, IN_TIM INT 21H ; 时间串提示 MOV AH, 0AH LEA DX, KEYBUF INT 21H ; 输入时间串 MOV BL, 10 MOV AL, KEYBUF + 2 SUB AL, ’0’
MUL BL ADD AL, KEYBUF + 3 SUB AL, ’0’ CMP AL, 0 JB INVALID CMP AL, 24 JAE INVALID MOV CH, AL MOV AL, KEYBUF + 5 ; 判断 时 有效性
SUB AL, '0' MUL BL ADD AL, KEYBUF + 6 SUB AL, '0' CMP AL, 0 JB INVALID CMP AL, 60 JAE INVALID MOV CL, AL MOV AL, KEYBUF + 8 SUB AL, '0' MUL BL ADD AL, KEYBUF + 9 SUB AL, ’0’ CMP AL, 0 JB INVALID CMP AL, 60 JAE INVALID MOV DH, AL MOV DL, 0 MOV AH, 2DH INT 21H INVALID: CALL TIME RET TIMCHK ENDP TIME PROC ;设置显示器方式 MOV AH, 0 MOV AL, 3; MOV BL, 0; INT 10H MOV AH, 2 MOV BH, 0 MOV DL, 10 MOV DH, 9 INT 10H MOV AH, 9 LEA DX, HINTSTR INT 21H DISP1: MOV AH, 2 MOV BH, 0 MOV DL, 72
; 判断 分 有效性
; 判断 秒 有效性
; 置系统时间
; 显示时间子程序
; 清屏
; 页号
; 列号 ; 行号
; 提示信息光标位置设置
; 输出提示信息
; 页号 ; 列号
MOV DH, 0 INT 10H MOV AH, 2CH INT 21H MOV AL, CH CALL SHOWNUM MOV AH, 2 MOV DL, ':’ INT 21H MOV AL, CL CALL SHOWNUM MOV AH, 2 MOV DL, ':’ INT 21H MOV AL, DH CALL SHOWNUM MOV AH,02H MOV DX,090AH MOV BH,0 INT 10H MOV BX,0018H RE: MOV CX,0FFFFH REA: LOOP REA DEC BX JNZ RE MOV AH, 0BH INT 21H CMP AL, 0 JZ DISP1 RET TIME ENDP SHOWNUM PROC ; 入口参数:AL(待显示的数据); 出口参数:无 CBW PUSH CX PUSH DX MOV CL, 10 DIV CL ADD AH, '0’ MOV BH, AH ADD AL, ’0' MOV AH, 2 MOV DL, AL INT 21H MOV DL, BH INT 21H POP DX POP CX RET
SHOWNUM ENDP CODE ENDS END START
; 行号
; 提示光标位置设置
; 取系统时间,CH,CL,DH分别存放时/分/秒
; 显示 时
; 显示 分
; 显示 : 秒
; 设置光标位置
; 延时
; 或 MOV AH, 01H ; INT 16H ; JE DISP1 ; 检查键盘状态
; 把AL中的数字以十进制输出
五、实验结果
运行程序。
主菜单界面,如图5-1。
图5-1 主菜单界面
在主菜单界面(图5-1)输入1,进入功能1界面,实现将字符串中的小写字母变换成大写字母。功能1界面,如图5—2。输入字符串,如:HuangCui02061488,输出结果如图5—3。按ESC键,返回主菜单界面(图5—1);按其他任意键,返回功能1界面(图5—2)。
图5—2 功能1界面
图5-3 功能1运行结果
在主菜单界面(图5—1)输入2,进入功能2界面,实现在字符串中找最大值。功能2界面,如图5-4。输入字符串,如:HuangCui02061488,输出结果如图5-5.按ESC键,返回主菜单界面(图5—1);按其他任意键,返回功能2界面(图5-4)。
图5—4 功能2界面
图5—5 功能2运行结果
在主菜单界面(图5-1)输入3,进入功能3界面,实现输入数据组的排序,按递增方式进行排序并以十六进制数输出。功能3界面,如图5-6。输入数据组,如:255 15 0 1 16,输出
结果如图5—7;若输入数据越界或有错误,则需重新输入,如图5-6.按ESC键,返回主菜单界面(图5-1);按其他任意键,返回功能3界面(图5-6)。
图5—6 功能3界面
图5-7 功能3运行结果
在主菜单界面(图5-1)输入4,进入功能4界面,实现时间的显示.功能4界面,如图5—8。输入用户设置的时间;若输入时间越界或有错误,则不修改系统时间,直接进行实时显示。如:输入12:70:00,输出结果如图5—9(显示时间由系统当时获取时间决定,本实验时,系统时间为18:27:36);输入12:00:00,输出结果如图5—10。接着,界面对时间进行实时显示,此处仅作文字说明,不附图。按ESC键,返回主菜单界面(图5—1);按其他任意键,返回功能4界面(图5—8)。
图5-8 功能4界面
图5-9 功能4运行结果1
图5—10 功能4运行结果2
在主菜单界面(图5-1)输入5,结束程序的运行,返回操作系统。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务