大写字母 abcd对应的ascii码以及二进制:
A 41H 0100 0001B
B 42H 0100 0010B
C 43H 0100 0011B
D 44H 0100 0100B
小写字母 abcd对应的ascii码以及二进制:
a 61H 0110 0001B
b 62H 0110 0010B
c 63H 0110 0011B
d 64H 0110 0100B
大写转小写,只需二进制和0010 0000B进行或运算即可:
or 0010 0000B ;大写变成小写, 小写依然还是小写
小写转大写,只需二进制和1101 1111B进行与运算即可:
and 1101 1111B ;小写变成大写, 大写依然还是大写
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]进行优化,结果为:
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