汇编中的大小写字母转换的方法

在汇编语言中,要实现大小写字母的转换,我们得先分析一下大写字母和小写字母的ASCII码,通过比较可以发现,大写字母和小写字母之间二进制的区别就是第6位1还是0,如果是大写字母第6位为0,如果是小写字母,第6位则为1,举个例子:A的二进制表示为:0100 0001,a的二进制表示为:0110 0001,通过对比可以发现,它们的区别就是第六位是一还是0。大写字母的第六位为0,小写字母的第六位为1。知道这个就好办了:

如果要转换成大写字母,则使用and指令把ASCII码的第6位置0;

and al,11011111B

如果要转换成小写字母,则使用or指令把ASCII码的第6为置1。

or al,00100000B

下面把程序中给出的三个字符串的小写字母转换为大写字母:

汇编代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'abc '
db 'lib '
db 'dos '
datasg ends

stacksg segment
dw 0,0,0,0,0,0,0,0 ;定义一个段,用来做栈段,容量为16个字节
stacksg ends

codesg segment

start:mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0

mov cx,3 ;外层循环三次,对应为数据段中的三个字符串
s0: push cx ;将外层循环的cx值压栈保存
mov si,0
mov cx,3 ;内层循环三次,对应为数据段中给出的每个字符串的三个字母

s: mov al,\[bx+si\] ;
and al,11011111b ;使用and把小谢字母转换为大写字母
mov \[bx+si\],al ;重新保存到内存单元中
inc si ;si加1,继续循环修改下一个字母
loop s

add bx,16 ;把bx加上16指向下一个字符串所在的地址
pop cx ;从栈顶弹出原来的cx值,恢复cx
loop s0

mov ax,4c00h
int 21h

codesg ends
end start

这样就实现了汇编中的大小写字母的转换。

arthinking wechat
欢迎关注itzhai公众号