王爽老师的《汇编语言》读到第7章,发现一个很有趣的例子。
题目如下:
在codesg中填写代码,将datasg中的第一个字符串转化为大写,第二个字符串转化为小写。
assume cs:codesg,ds:datasg

datasg segment

db
'
BaSiC
'
db
'
iNfOrMaTiOn
'

datasg ends

codesg segment

start:
codesg ends
end start
请看下面的数据:
大写 十六进制 二进制 小写 十六进制 二进制
A 41 01000001 a 61 01100001
B 42 01000010 b 62 01100010
C 43 01000011 c 63 01100011
..........
通过对比,我们不难发现:大写字母ASCII码的第5位为0,小写字母的第5位为1,这样,我们不管它原来是大写还是小写,我们将它的第5位置0,它就变成大写字母,置1则变成小写字母。然后用and和or指令完成代码:
完整程序如下:
assume cs:codesg,ds:datasg

datasg segment

db
'
BaSiC
'
db
'
iNfOrMaTiOn
'

datasg ends

codesg segment

start:
mov ax,datasg
mov ds,ax
mov bx,
0
mov cx,
5
s:mov al,[bx] ;将ASCII码从ds:bx所指向的单元取出
and al,11011111B ;将al中的ASCII码的第5位置为0,变成大写字母
mov [bx],al
inc bx
loop s
mov bx,
5
mov cx,
11
s0:mov al,[bx]
or al,00100000B ;将al中的ASCII码的第5位置为1,变成小写字母
mov [bx],al
inc bx
loop s0

mov ax,4c00h
int
21h

codesg ends
end start