汇编实现 一个字符串的大小写转换
程序员文章站
2024-03-15 17:28:12
...
一、原理
字符串中的字母是大写字母还是小写字母呢?用汇编语言来判断显然有点难。
转换个思路,利用ASCII码中的字符的二进制表示的一些特征,我们能不能找到一种很方便地转化大小写的方法呢?
我们考察一下ASCII码中大写字母(A-Z)和小写字母(a-z)的二进制形式:ASCII编码对照表
字符 | 二进制编码 |
---|---|
A | 0100 0001 |
a | 0110 0001 |
B | 0100 0010 |
b | 0110 0010 |
C | 0100 0011 |
c | 0110 0011 |
D | 0100 0100 |
d | 0110 0100 |
… | … |
Z | 0101 1010 |
z | 0111 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位,而CX为16位寄存器,大小不一致)
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位,而CX为16位寄存器,大小不一致)
;串操作的初始化 源串 目标串 串长度
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位,而CX为16位寄存器,大小不一致)
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~~
推荐阅读
-
汇编实现 一个字符串的大小写转换
-
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写(力扣)
-
算法(一)写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写
-
Java实现字符串倒序输出以及判断一个字符串中某个字符的出现次数
-
实现一个输出字符串中各个字符出现的频率frequency函数
-
Java实现的一个简单的字符串压缩算法源码
-
用Java将字符串的首字母转换大小写
-
用Java将字符串的首字母转换大小写
-
PHP实现ASCII码与字符串相互转换的方法
-
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例