x86汇编语言之大小写快速转换

分析

大写字母 abcd对应的ascii码以及二进制:

1
2
3
4
A  41H  0100 0001B
B 42H 0100 0010B
C 43H 0100 0011B
D 44H 0100 0100B

小写字母 abcd对应的ascii码以及二进制:

1
2
3
4
a  61H  0110 0001B
b 62H 0110 0010B
c 63H 0110 0011B
d 64H 0110 0100B

发现规律

大写转小写,只需二进制和0010 0000B进行或运算即可:

1
or 0010 0000B ;大写变成小写, 小写依然还是小写

小写转大写,只需二进制和1101 1111B进行与运算即可:

1
and 1101 1111B ;小写变成大写, 大写依然还是大写

示例代码

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
41
42
43
assume cs:code ,ds:data

data segment
db 'ABcDEF'
db 'abCdef'
data ends


code segment

start:
mov ax ,data
mov ds,ax
mov bx,0

mov ax,data
mov es,ax

mov cx,6

downLetter: ;大写转小写
mov dl,ds:[bx]
or dl,00100000B
mov es:[bx],dl
inc bx
loop downLetter


mov cx,6
mov bx,6
upLetter: ;小写转大写
mov dl,ds:[bx]
and dl,11011111B
mov es:[bx],dl
inc bx
loop upLetter

mov ah,4ch
int 21h


code ends
end start

以上代码可使用偏移地址组合方式[bx+x]进行优化,结果为:

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
assume cs:code ,ds:data

data segment
db 'ABcDEF'
db 'abCdef'
data ends


code segment

start:
mov ax ,data
mov ds,ax
mov bx,0

mov ax,data
mov es,ax

mov cx,6

changeLetter:
;大写转小写
mov dl,ds:[bx]
or dl,00100000B
mov es:[bx],dl
;小写转大写
mov dl,ds:[bx+6]
and dl,11011111B
mov es:[bx+6],dl
inc bx
loop changeLetter


mov ah,4ch
int 21h


code ends
end start

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%