汇编实现⼀个字符串的⼤⼩写转换
⼀、原理
字符串中的字母是⼤写字母还是⼩写字母呢?⽤汇编语⾔来判断显然有点难。
转换个思路,利⽤ASCII码中的字符的⼆进制表⽰的⼀些特征,我们能不能到⼀种很⽅便地转化⼤⼩写的⽅法呢?我们考察⼀下ASCII码中⼤写字母(A-Z)和⼩写字母(a-z)的⼆进制形式:
字符⼆进制编码
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 DB20,?,20DUP(?);准备⽤于21H中断调⽤的字符串输⼊功能的⽤户⾃定义缓冲区,分为三部分:最⼤存储容量(占1B),实际存储字符数(占1B),存储区
OUTPUT DB21DUP(?);处理后的字符串(多⼀个字节的位置⽤于存放'$')
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
INT21H
LEA DX,BUFF
MOV AH,10;字符串输⼊功能号-10
INT21H
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
INT21H
MOV AH,4CH ;返回DOS功能号-4CH
INT21H
CSEG ENDS
END START
将写好的代码保存在 toupper.asm中
使⽤DOSBOX进⾏验证:
1.汇编
2.链接
3.运⾏
(后⾯的⼩三⾓是QQ截图误触了什么搞得,忽略它⑧)
成功!NICE~~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论