汇编实现 一个字符串的大小写转换

一、原理

字符串中的字母是大写字母还是小写字母呢?用汇编语言来判断显然有点难。
转换个思路,利用ASCII码中的字符的二进制表示的一些特征,我们能不能找到一种很方便地转化大小写的方法呢?
我们考察一下ASCII码中大写字母(A-Z)和小写字母(a-z)的二进制形式:ASCII编码对照表

字符二进制编码
A0100 0001
a0110 0001
B0100 0010
b0110 0010
C0100 0011
c0110 0011
D0100 0100
d0110 0100
Z0101 1010
z0111 1010

我们发现了一个特征!

大写字母的ASCII码二进制编码的bit5=0,而小写字母的bit5=1

二、实现

DSEG SEGMENT
	MESS DB 'Please input string:',0DH,0AH,'$'							;准备用于21H中断调用的字符串显示输出功能,为了美观,添加了回车(0DH)和换行符(0AH)
	BUFF DB 20,?,20 DUP(?)																	;准备用于21H中断调用的字符串输入功能的 用户自定义缓冲区,分为三部分:最大存储容量(占1B),实际存储字符数(占1B),存储区
	OUTPUT DB 21 DUP(?)																			;处理后的字符串(多一个字节的位置用于存放'$')
DSEG ENDS
CSEG SEGMENT
	ASSUME CS:CSEG,DS:DSEG,ES:DSEG													;串操作的目标串应该是附加串(ES),为了节省空间将DSEG也声明为ES
	START:MOV AX,DSEG
				MOV DS,AX																					;DS段寄存器初始化
				MOV ES,AX																					;ES段寄存器初始化
				LEA DX,MESS
				MOV AH,9																					;字符串显示输出功能号-9
				INT 21H
				
				LEA DX,BUFF
				MOV AH,10																					;字符串输入功能号-10
				INT 21H
				
				XOR CX,CX																					;CX自异或 清零
				MOV CL,BUFF+1																			;将实际输入的字符串的长度送给CL   (不能直接给CX,因为BUFF+1处存储的“实际键入字符数”只有1个字节/8位,而CX16位寄存器,大小不一致)
				MOV BX,OFFSET BUFF+2															;此时DS:[BX]指向的是我们键入的第一个字符
				
				;将输入的字符串进行大写转化
				
	 NEXT:MOV AL,DS:[BX]
				AND AL,11011111B																	;bit5=0,转化成大写字母
				MOV DS:[BX],AL
				INC BX
				LOOP NEXT																					;如果CX!=0,则继续NEXT
				
				XOR CX,CX																					;CX自异或 清零
				MOV CL,BUFF+1																			;将实际输入的字符串的长度送给CL   (不能直接给CX,因为BUFF+1处存储的“实际键入字符数”只有1个字节/8位,而CX16位寄存器,大小不一致)

				;串操作的初始化 源串 目标串 串长度
				LEA DI,OUTPUT
				LEA SI,BUFF+2
				CLD										
																	
	 			REP MOVSB																					;按字节 串传送
	 			
	 			;(别忘了在OUTPUT串的末尾添加一个'$')我们要先找到预存放'$'的偏移地址
	 			XOR CX,CX																					;CX自异或 清零
				MOV CL,BUFF+1																			;将实际输入的字符串的长度送给CL   (不能直接给CX,因为BUFF+1处存储的“实际键入字符数”只有1个字节/8位,而CX16位寄存器,大小不一致)
				MOV BX,OFFSET OUTPUT
	NEXT1:INC BX
				LOOP NEXT1
				INC BX
				
				MOV	AL,24H
				MOV DS:[BX],AL																		;在合适的位置添加'$'
				
				;输出转化后的字符串
				MOV AH,09H
				MOV DX,OFFSET OUTPUT
				INT 21H
				
				MOV AH,4CH																				;返回DOS功能号-4CH
				INT 21H
CSEG ENDS
		 END START

将写好的代码保存在 toupper.asm中
在这里插入图片描述
使用DOSBOX进行验证:
在这里插入图片描述

1.汇编

在这里插入图片描述

2.链接

在这里插入图片描述

3.运行

在这里插入图片描述
(后面的小三角是QQ截图误触了什么搞得,忽略它⑧)
在这里插入图片描述

成功!NICE~~

  • 13
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值