目的:
编写英文打字练习软件,综合复习字符输入和显示,置光标、开窗口、颜色设置等屏幕功能;掌握分支程序中字符比较及统计的程序设计,循环及排序程序设计方法;加入中断调用的计时功能。通过上述综合性训练,进一步加深对汇编语言的理解和提高程序设计技能。
内容:
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
```