汇编语言实现键盘输入的小写字母转换成大写字母和寻找并输出显示键盘输入的最大的字符

一 代码实现

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.

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值