目录
题目1、猜数程序,程序中预设一数字字符M,(如:‘5’)从键盘输入一个数字字符N,判断:若N >M,在屏幕上显示输出字符串“TOO BIG”;若N
题目3、预留字符串口令,输入口令串与预留密码串比较。若匹配则显示“MATCH”,否则显示“NOMATCH!,PROGRAM TERMINATED!”
题目4、上述程序1、2、3分别完成后请编写一个程序来实现简单的程序菜单显示。(采用地址跳跃表法实现)
题目1: 猜数程序,程序中预设一数字字符M,(如:‘5’)从键盘输入一个数字字符N,判断:若N >M,在屏幕上显示输出字符串“TOO BIG”;若N <M 则显示“TOO SMALL”;否则显示“YOUR ARE RIGHT”
实验程序如下所示:
assume cs: code, ds: data
data segment
string db 'Please input a number:$'
big db 0dh,0ah,'too big$'
small db 0dh,0ah,'too small$'
equal db 0dh,0ah,'you are right$'
data ends
code segment
start:
mov ax, data
mov ds, ax
lea dx, string
mov ah, 9
int 21h
mov ah, 1 ;读入字符
int 21h
cmp al, '5' ;对字符进行比较
ja res1
jb res2
jz res3
res1:
lea dx,big
jmp exit
res2:
lea dx,small
jmp exit
res3:
lea dx,equal
jmp exit
exit:
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
多次运行程序,得到如下结果,与预期结果一致
题目二:
编写一个程序,判别键盘上输入的字符;若是0-9字符,则显示“IT IS A DIGITAL”;若为A-Z或a-z字符,均显示“IT IS A LOWCASE LETTER”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
实验程序如下所示:
;'0'-'9'的ASCII码在30-39之间
;'a'-'z'的ASCII码在61-7AH之间
;'A'-'Z'的ASCII码在41-5AH之间
assume cs: code, ds: data
data segment
string db 'Please input a character:$'
digit db 0dh,0ah,'it is a digit$'
letter db 0dh,0ah,'it is a lowcase letter$'
data ends
code segment
start:
mov ax, data
mov ds, ax
lea dx, string
mov ah, 9
int 21h
lop:
mov ah, 1 ;读入字符
int 21h
cmp al, 0dh ;对字符进行比较
jbe exit ;若小于等于0dh直接退出
cmp al,30H ;否则大于0dh
jb lop ;0DH-30H继续循环
cmp al,39h ;否则>=30H
jbe res1 ;>=30H,<=39H
cmp al,41H ;否则>39H
jb lop ;>39H,<41H继续循环
cmp al,5AH ;>=41H,<=5AH,结束输出lowcase letter
jbe res2
cmp al,61H ;否则>5AH
jb lop ;>5AH,<61H,继续循环
cmp al,7AH ;>=5AH
jbe res2 ;>=5AH,<=7AH,结束输出lowcase
res1:
lea dx,digit
mov ah,9
int 21h
jmp exit
res2:
lea dx,letter
mov ah,9
int 21h
jmp exit
exit:
mov ax,4c00h
int 21h
code ends
end start
运行结果如下所示:
1、当直接输入回车字符时,程序直接结束 2、当输入数字0-9时,显示it is a digit 3、当输入字母大写或者小写时,都显示it is a lowcase letter 4、当输入其它字符时,继续输入字符,直到遇到上述字符才会结束程序 |
题目三:
预留字符串口令,输入口令串与预留密码串比较。若匹配则显示“MATCH”,否则显示“NOMATCH!,PROGRAM TERMINATED!”
实现程序如下所示:
assume cs: code, ds: data
data segment
string db 'Please input your password:$'
password db "assembly"
buffer db 30 dup('0')
true db 0dh,0ah,'Match$'
false db 0dh,0ah,'NOMATCH!,Program Terminated!$'
data ends
code segment
start:
mov ax, data
mov ds, ax
lea dx, string
mov ah, 9
int 21h
lea dx,buffer
mov ah,0ah
int 21h ;读取字符串
mov cl,8h ;设置密码长度
inc dx
mov di,dx
mov byte ptr al,[di] ;获取输入字符的个数
cmp al,cl
jne res1 ;若两者长度不相等则直接退出
lea si,password ;密码位置
lea di,buffer ;输入串位置
add di,2
lop:
mov byte ptr al,[si]
mov byte ptr ah,[di]
cmp al,ah ;比较si和di中的字符是否相等
jne res1 ;不相等,结果为false
inc si ;否则相等
inc di
loop lop
jmp res2 ;说明相等,结果为true
res1:
lea dx,false
mov ah,9
int 21h
jmp exit
res2:
lea dx,true
mov ah,9
int 21h
jmp exit
exit:
mov ax,4c00h
int 21h
code ends
end start
分析:
设置初始密码为:’assembly’,用户输入密码至buffer缓冲区,比较缓冲区与字符串,1、首先比较两者的长度,若长度不一致,直接返回结果false
2、若两者长度一致,则通过循环来比较两者的实际内容是否一致,一致返回true,否则,返回false
运行结果如下所示:
输入正确密码,返回Match 输入错误密码,返回false 输入正确密码,但是长度不一致,返回false |
题目四:
4. 上述程序1、2、3分别完成后请编写一个程序来实现简单的程序菜单显示。(采用地址跳跃表法实现)
显示一个菜单要求用户从下表中选择:
- GUESS NUMBER GAME (对应-->程序1)
- CHAR SELECTION PROGRAM (对应-->程序2)
- PASSWORD PROGRAM (对应-->程序3)
- PRESS “ESC” TO QUIT
用户作出选择1~3时,显示输出要执行操作的名字,如“Your selection is 1,the program will execute GUESS NUMBER GAME!”然后转向相应的程序去执行,执行结束前进行退出的判断,显示一个提示信息“will you continue program really?(Y:N)”要求用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则返回到菜单。若用户选择4,要求程序显示提示信息“Please press ESC key to exit!”,并能按要求正确退出。
实现程序如下所示:
;地址跳跃表法实现分支程序设计
assume cs: code, ds: data,es:data
data segment
branch_table dw routine_1
dw routine_2
dw routine_3
dw routine_4
continue db 0dh,0ah,'will you continue program really?(Y:N):$'
option1 db 0dh,0ah,'Your selection is 1,the program will execute GUESS NUMBER GAME!',0dh,0ah,'$'
option2 db 0dh,0ah,'Your selection is 2,the program will execute Char Selection Program!',0dh,0ah,'$'
option3 db 0dh,0ah,'Your selection is 3,the program will execute Password Program!',0dh,0ah,'$'
option4 db 0dh,0ah,'Please press ESC key to exit:$'
menu db 0dh,0ah,'1: Guess Number Game',0dh,0ah
db '2: Char Selection Program',0dh,0ah
db '3: Password Program',0dh,0ah
db '4: Press "ESC" to Quit',0dh,0ah
db 'Please input your option:',0dh,0ah,'$'
bye db 0dh,0ah,'GoodBye!',0dh,0ah,'$'
;--------------------game1------------------------
input1 db 'Please input a number:$'
big db 0dh,0ah,'too big$'
small db 0dh,0ah,'too small$'
equal db 0dh,0ah,'you are right$'
;-------------------game2-------------------------
input2 db 'Please input a character:$'
digit db 0dh,0ah,'it is a digit$'
letter db 0dh,0ah,'it is a lowcase letter$'
;-------------------game3-------------------------
input3 db 'Please input your password:$'
password db "assembly"
buffer db 30 dup('0')
true db 0dh,0ah,'Match$'
false db 0dh,0ah,'NOMATCH!,Program Terminated!$'
data ends
code segment
start:
mov ax, data
mov ds, ax
;--------------------show the game menu--------------
showmenu proc far
lea dx,menu
call output_string
mov ah,1h
int 21h
cmp al,'1'
jb exit
je routine_1
cmp al,'2'
je routine_2
cmp al,'3'
je routine_3
cmp al,'4'
je routine_4
ja exit
ret
showmenu endp
;------------------game_options-----------------
routine_1:
lea dx,option1
call output_string
jmp game1
jmp showmenu
routine_2:
lea dx,option2
call output_string
jmp game2
routine_3:
lea dx,option3
mov ah,9h
int 21h
jmp game3
routine_4:
lea dx,option4
call output_string
mov ah,1h
int 21h
cmp al,1bh ;1bh即ESC键的ASCII码
je exit
jmp routine_4
exit proc far
lea dx,bye
call output_string
mov ax,4c00h
int 21h
exit endp
;------------------game1-----------------------
_continue:
lea dx,continue
call output_string
mov ah,1
int 21h
cmp al,'Y' ;如果输入的是Y,则继续执行
je return2 ;返回原位置
cmp al,"N" ;如果输入的是N则返回菜单
je showmenu
jne _continue
game1:
mov ax,0
lea dx, input1
call output_string
mov ah, 1 ;读入字符
int 21h
cmp al, '5' ;对字符进行比较
ja _1res1
jb _1res2
jz _1res3
_1res1:
lea dx,big
call output_string
call _continue
jmp game1
_1res2:
lea dx,small
call output_string
call _continue
jmp game1
_1res3:
lea dx,equal
call output_string
call _continue
jmp game1
return2:
mov ah,2
mov dl,0ah ;输出回车
int 21h
ret
;------------------game2------------------
game2:
lea dx, input2
call output_string
_2lop:
mov ah, 1 ;读入字符
int 21h
cmp al, 0dh ;对字符进行比较
jbe exit2 ;若小于等于0dh直接退出
cmp al,30H ;否则大于0dh
jb _2lop ;0DH-30H继续循环
cmp al,39h ;否则>=30H
jbe _2res1 ;>=30H,<=39H
cmp al,41H ;否则>39H
jb _2lop ;>39H,<41H继续循环
cmp al,5AH ;>=41H,<=5AH,结束输出lowcase letter
jbe _2res2
cmp al,61H ;否则>5AH
jb _2lop ;>5AH,<61H,继续循环
cmp al,7AH ;>=5AH
jbe _2res2 ;>=5AH,<=7AH,结束输出lowcase
_2res1:
lea dx,digit
call output_string
call _continue
jmp game2 ;如果调用返回,说明输入的是Y,继续执行
_2res2:
lea dx,letter
call output_string
call _continue
jmp game2 ;如果调用返回,说明输入的是Y,继续执行
exit2 proc far
lea dx,bye
call output_string
mov ax,4c00h
int 21h
exit2 endp
;------------------game3----------------------
game3:
lea dx, input3
call output_string
lea dx,buffer
mov ah,0ah
int 21h ;读取字符串
mov cl,8h ;设置密码长度
inc dx
mov di,dx
mov al,[di] ;获取输入字符的个数
cmp al,cl
jne _3res1 ;若两者长度不相等则直接退出
lea si,password ;密码位置
lea di,buffer ;输入串位置
add di,2
_3lop:
mov al,[si]
mov ah,[di]
cmp al,ah ;比较si和di中的字符是否相等
jne _3res1 ;不相等,结果为false
inc si ;否则相等
inc di
loop _3lop
jmp _3res2 ;说明相等,结果为true
_3res1:
lea dx,false
call output_string
call _continue
jmp game3
_3res2:
lea dx,true
call output_string
call _continue
jmp game3 ;如果调用返回,说明输入的是Y,继续执行
return:
mov ah,2
mov dl,0ah ;输出回车
int 21h
ret
output_string:
mov ah,9h
int 21h
ret
exit3 proc far
lea dx,bye
call output_string
mov ax,4c00h
int 21h
exit3 endp
code ends
end start
运行结果如下所示:
- 菜单提示输入功能选项:
|
- 功能1猜字游戏测试:
|
可以观察到输入字符1后,进入猜字游戏进行猜字猜字游戏结束后,系统进行提问是否继续执行,输入Y,继续执行该游戏,输入N则返回菜单。
- 功能2游戏Char Selection Program测试:
|
可以观察到,输入2后进入字符选择程序,输入字符,输出结果,结束字符选择程序后,系统提示是否继续执行,输入Y后,继续执行该游戏,输入N则返回菜单。
- 功能3游戏Password Program测试
|
如下所示,当输入3后,进入Password Program,输入密码后,程序输出退出,当系统提示是否继续时,只有输入Y/N时才可跳转出提示程序,否则系统将一致询问直到输入正确为止。
- 功能4退出程序功能测试:
如下所示,输入4,系统显示提示信息Please press ESC key to exit,当输入esc键之后才会退出程序,否则不断输入直到输入正确为止。
|