一 代码实现
assume cs:code,ds:data,ss:stack
data segment ;数据段
W0 db 'Program by HOU SH 2017w',0dh,0ah,'$' ;提示语
W1 db 'Please input number 1~3.',0dh,0ah,'$'
W2 db '1.Input a string. Then concert the small letters to big letter.',0dh,0ah,'$'
W3 db '2.Find the character whose ASCII code is biggest.',0dh,0ah,'$'
W6 db '3.End the program.',0dh,0ah,'$'
W7 db 'Press any key to do again or ESC to return to main menu.',0dh,0ah,'$'
B1 db 'Please input a string:',0dh,0ah,'$'
B2 db 100
db ?
db 100 dup(0)
STRING5 DB 0DH,0AH,'$'
data ends
stack segment
db 256 dup(?) ;备用
stack ends
code segment ;代码段
start:
mov ax,data ;定义DS:DX
mov ds,ax ;DS指向缓冲区首地址基地址
mov es,ax ;附助段寄存器 ES ←AX的内容
call showmnu ;调用showmnu显示菜单子程序
s0:
mov ah,01h ;调用DOS1号功能,读取键盘输入并显示
int 21h
LEA DX,STRING5 ;把STRING5的地址传给DX
MOV AH,9 ;调用DOS9号功能回车换行
INT 21H
cmp al,31h ;与1的ASCII码比较
jne s1 ;不是1,转到s1
call changeletter ;是1,调用changeletter字母转换子程序
s1:
cmp al,32h ;与2的ASCII码比较
jne s4 ;不是2,转到s4
call max ;是2,调用最大ASCII码值字符子程序
s4:
cmp al,35h ;与5的ASCII码比较
jmp p5 ;转到p5
;;;;;;;;;showmnu显示菜单子程序
showmnu proc near
lea dx,W0 ;把W0的地址传给dx
mov ah,09h ;调用DOS9号功能,显示w0的提示语
int 21h
lea dx,W1 ;把W1的地址传给dx
mov ah,09h ;调用DOS9号功能,显示w1的提示语
int 21h
lea dx,W2 ;把W2的地址传给dx
mov ah,09h ;调用DOS9号功能,显示w2的提示语
int 21h
lea dx,W3 ;把W3的地址传给dx
mov ah,09h ;调用DOS9号功能,显示w3的提示语
int 21h
lea dx,W6 ;把W6的地址传给dx
mov ah,09h ;调用DOS9号功能,显示w6的提示语
int 21h
ret ;返回主程序
showmnu endp
;;;;;;;;changeletter 字母转换子程序
changeletter proc near
lea dx,B1 ;把B1的地址传给dx
mov ah,09h ;输出提示字符串
int 21h
lea dx,B2 ;把B2的地址传给dx
mov ah,0ah ;输入想转换的字符串
int 21h
lea dx,B2 ;把B2的地址传给dx
mov bx,dx ;把dx的内容传给bx
mov ch,0 ;ch清0
mov cl, byte ptr [bx+1] ;把bx中的字节数传给cl,设置循环的次数
add dx, 2 ;dx ←dx+2
mov di, dx ;把dx的内容传给di
changeletter0:
cmp byte ptr [di],61h ;读取di一个字节的数据与61h(即字母a)比较
jb changeletter1 ;小于字母a的ASCII码,转到changeletter1
cmp byte ptr [di],7ah ;读取di一个字节的数据与7ah(即小写字母z)比较
ja changeletter1 ;大于小写字母z的ASCII码,转到changeletter1
sub byte ptr [di],20h ;在小写字母a到z的范围内,ASCII码减去20h,对应大写字母的ASCII码,完成字母转换
changeletter1:
inc di ;di自增1,指向下一字节数据
loop changeletter0 ;循环changeletter0
mov byte ptr [di],0dh ;回车
inc di
mov byte ptr [di],0ah ;下一字节,换行
inc di
mov byte ptr [di],'$' ;下一字节,字符串结束符
lea dx,B2 ;把B2的地址传给dx
add dx,2 ;dx ←dx+2,指向实际字符的地址
mov ah,09h ;输出字符串
int 21h
lea dx,W7 ;把w7的地址传给dx
mov ah,09h ;输出选择功能字符串
int 21h
mov ah,07h ;等待键盘输入,输入字符无回显
int 21h
cmp al,1bh ;ESC键的ASCII码
jne changeletter ;不是ESP键的ASCII码,转到changeletter
jmp start ;是ESP键的ASCII码,转到start
changeletter endp
max proc near ;求最大ASCII码值字符子程序
lea dx,B1 ;把B1的地址传给dx
mov ah,09h ;调用DOS9号功能
int 21h
lea dx,B2 ;把B2的地址传给dx
mov ah,0ah ;键盘输入到缓冲区
int 21h
LEA DX,STRING5 ;把STRING5的地址传给dx
MOV AH,9 ;调用DOS9号功能回车换行
INT 21H
lea dx,B2 ;把B2的地址传给dx
mov bx,dx ;把dx的地址传给bx
mov ch,0 ;ch清0
mov cl,[bx+1] ;把实际键入的字节数传给cl,设置循环的次数
add dx,2 ;dx ←dx+2
mov di,dx ;把键入字符的ASCII码传给di
mov ax,0 ;ax清0
max0:
cmp al,byte ptr [di] ;al与di指向的字节数据比较
ja max1 ;al大,则转到max1
mov al,byte ptr [di] ;后者大,则把后者的内容传给al
max1:
inc di ;di自增1,指向下一字节数据
loop max0 ;循环max0,直到所有的字节的数据都比较完,最大的数据对应的ASCII码存在AL
mov di,dx ;把dx的内容传给di
mov [di],al ;把al存的最大的ASCII码值的字符传给[di]
inc di ;di自增1
mov byte ptr [di],0dh ;回车
inc di
mov byte ptr [di],0ah ;换行
inc di
mov byte ptr [di],'$' ;字符串结束符
lea dx,B2 ;把B2的地址传给dx
add dx,2 ;dx ←dx+2,对应最大的ASCII码值的字符
mov ah,09h ;DOS9号功能调用,显示最大的ASCII码值的字符
int 21h
lea dx,W7 ;把w7的地址传给dx
mov ah,09h ;DOS9号功能调用,显示提示语
int 21h
mov ah,07h ;DOS7号功能调用,键盘输入无回显
int 21h
cmp al,1bh ;ESC键的ASCII码
jne max ;不是ESC键的ASCII码,转到max
jmp start ;是ESC键的ASCII码,转回start
max endp
P5:
lea dx,W0 ;把W0的地址传给dx
mov ah,09h ;调用DOS9号功能,显示
int 21h
s:
mov ax,4c00h ;返回DOS
int 21h
code ends
end start
该程序的功能是:首先显示字符串信息(主菜单)——提示用户,根据主菜单选择该程序的各项功能。用户可选择1~3的任何一项,即可执行相关功能:
按1键:要求输入字符串(以回车结束),程序将对所输入的字符串中的小写字母均转换成大写字母,其它字符不变,并在屏幕上显示。最后,用户按任一键,即可重做这项功能,而按ESC键,则是返回主菜单。
按2键:要求输入字符串(以回车结束),程序将对其中ASCII码值最大的字符进行显示。用户按任一键,重做这项功能,而按ESC键,则返回主菜单。
按3键,结束整个程序的运行。
二 运行结果
按1键字母转换子程序运行截图(输入aBc)
分析:转换结果为ABC,正确的实现了小写字母转大写字母
按2键显示输入ASCII码最大的字符子程序运行截图(输入1a2B)
分析:结果为输入1a2B 中的ASCII码最大的字符是a,与理论相符,程序正确。
按3键,结束整个程序的运行。
分析:输入3,直接结束程序,返回DOS.