目的:
编写英文打字练习软件,综合复习字符输入和显示,置光标、开窗口、颜色设置等屏幕功能;掌握分支程序中字符比较及统计的程序设计,循环及排序程序设计方法;加入中断调用的计时功能。通过上述综合性训练,进一步加深对汇编语言的理解和提高程序设计技能。
内容:
1.屏幕出现打字练习菜单(格式自定,字体、字号、颜色)
2.菜单项目为4项:照打,覆盖打,名次,退出
程序框图:
代码实现
```
data segment
menu db 0ah,0dh,' Input number to chose your function'
db 0ah,0dh,' 1.Follow Typing'
db 0ah,0dh,' 2.Cover Typing'
; db 0ah,0dh,' 3.Ranking'
db 0ah,0dh,' 3.Exit'
db 0ah,0dh,'Please input your select:$'
mess1 db 0ah,0dh,' This is the Follow Typing page.'
db 0ah,0dh,' Please input accordance with those word!$'
mess2 db 0ah,0dh,' This is the Cover Typing page.'
db 0ah,0dh,' Please input accordance with those word!'
db 0ah,0dh,' (Yellow is right, Red is wrong!)$'
mess3 db 0ah,0dh,'This is third select$'
mess4 db 0ah,0dh,' Thank you for your use!$'
mess5 db 0ah,0dh,'Your right number is:$'
endline db 0ah,0dh,'$'
mess db 255,?,255 dup(?)
text db 'New strides have been taken in strengthening national defense and army building.$'
right db '0$'
sum db '/80$'
num db 0
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
let0:
mov ax,0
mov dx,offset menu ;显示菜单
mov ah,9
int 21h
mov ah,1 ;输入选择
int 21h
cmp al,'1' ;输入为1,跳转到照打界面
jz prog1
cmp al,'2' ;输入为2,跳转到覆盖打界面
jz prog2
cmp al,'3' ;输入为3,跳转到名次界面
jz prog3
jmp prog4 ;输入不为1或2或3,退出程序
prog1:
jmp real_prog1
prog2:
jmp real_prog2
prog3:
jmp real_prog3
prog4:
jmp real_prog4
real_prog1: ;照打界面
mov ax,0003h ;清屏
int 10h
mov dx,offset mess1 ;显示提示信息
mov ah,9
int 21h
mov dx,offset endline ;换行
int 21h
mov dx,offset endline ;换行
int 21h
mov dx,offset text ;显示文章
mov ah,9
int 21h
mov dx,offset endline ;换行
int 21h
mov dx,offset mess ;输入串
mov ah,10
int 21h
;输入完毕,开始进行循环比较
mov ax,0
mov di,0 ;存储正确个数
mov cl,mess+1 ;输入的字母个数,即循环的次数
mov bx,2 ;第一个字符的单元位置
let1:
mov dl,text[bx-2]
cmp mess[bx],dl ;判断是否输入正确
jz let2 ;输入正确 跳到let2
jmp out1 ;跳到公共出口 out1
let2: ;正确数+1
add ax,1
add di,1
out1:
dec cl ;循环次数-1
inc bx
cmp cl,0
jnz let1
jz out2
out2: ;检查结束,输出结果
mov dx,offset mess5
mov ah,9
int 21h
;输出正确个数
mov ax,di
mov bl,10
div bl
add ah,'0'
mov right,ah
add al,'0'
mov dl,al
mov ah,2
int 21h
mov dl,right
mov ah,2
int 21h
mov right,0 ;重置right为0
mov di,0
mov dx,offset sum
mov ah,9
int 21h
jmp let0 ;返回选择菜单
real_prog2: ;覆盖打界面
mov dx,offset mess2
mov ah,9
int 21h
mov ax,0003h ;清屏
int 10h
;置显示光标
mov ah,2
mov dh,4
mov dl,0
mov bh,0
int 10h
;显示串
mov dx,offset mess2
mov ah,9
int 21h
mov dx,offset endline ;换行
int 21h
mov dx,offset endline ;换行
int 21h
mov dx,offset text
mov ah,9
int 21h
;置输入光标
mov ah,2
mov dh,9
mov dl,0
int 10h
mov si,80 ;循环次数
mov bx,0 ;第一个字符的单元位置
mov di,0 ;正确个数
mov num,0 ;显示列的位置
prog2_let1:
;输入字符
mov ah,1
int 21h
mov dl,text[bx]
cmp al,0DH ;判断是否输入回车
jz prog2_out2
cmp al,dl ;判断是否输入正确
jz prog2_let2 ;输入正确 跳到let2
cmp al,dl
jnz prog2_let3 ;输入错误,跳到let3
jmp prog2_out1 ;跳到公共出口out1
prog2_let2:
add di,1 ;正确数+1
;输入正确,改变为黄色
mov ah,06h
mov al,0
mov bh,0eh
mov ch,8
mov cl,num
mov dh,9
mov dl,num
int 10h
;置显示光标
mov ah,2
mov dh,9
mov dl,num
mov bh,0
int 10h
mov dl,text[bx]
mov ah,2
int 21h
jmp prog2_out1 ;跳到公共出口out1
prog2_let3:
;输入错误,响铃
mov ah,2
mov dl,7
int 21h
;输入错误,改变为红色
mov ah,06h
mov al,0
mov bh,04h
mov ch,8
mov cl,num
mov dh,9
mov dl,num
int 10h
;置显示光标
mov ah,2
mov dh,9
mov dl,num
mov bh,0
int 10h
mov dl,text[bx]
mov ah,2
int 21h
jmp prog2_out1 ;跳到公共出口out1
prog2_out1:
dec si ;循环次数-1
inc bx
inc num
cmp si,0
jnz jump_prog2_let1 ;si≠0,继续循环
jz prog2_out2
jump_prog2_let1:
jmp prog2_let1
prog2_out2: ;循环结束,输出结果
mov dx,offset mess5
mov ah,9
int 21h
;输出正确个数
mov ax,di
mov bl,10
div bl
add ah,'0'
mov right,ah
;add al,74
add al,'0'
mov dl,al
mov ah,2
int 21h
mov dl,right
mov ah,2
int 21h
mov right,0 ;重置正确个数为0
mov di,0
mov dx,offset sum
mov ah,9
int 21h
jmp let0
real_prog3: ;名次界面
mov dx,offset mess3
mov ah,9
int 21h
jmp let0 ;返回选择菜单
real_prog4: ;退出
mov dx,offset mess4
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end start
```