将datasg中的第一个字符串转化为大写,第二个字符串转化为小写。
第一种方法:
assume cs:codesg,ds:datasg
datasg segment
db 'BaSic'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start: mov ax, datasg
mov ds, ax ;设置ds指向datasg段
mov bx, 0 ;设置(bx)=0, ds:bx指向'BaSic'的第一个字母
mov cx, 5 ;设置循环次数5,因为'BaSic'有5个字母
s: mov al, [bx] ;将ASCII码从ds:bx所指向的单元中取出
and al, 11011111h ;将al中的ASCII码的第5位置为0,变为大写字母
mov [bx], al ;将转变后的ASCII码写回原单元
inc bx ;(bx)加1,ds:bx指向下一个字母
loop s
mov bx, 5 ;设置(bx)=5,ds:bx指向'iNfOrMaTiOn'的第一个字母
mov cx, 11
s0: mov al, [bx]
or al, 00100000h
mov [bx], al
inc bx
loop s0
mov ax, 4c00h
int 21h
codesg ends
end start
第二种方法:用[bx + idata]的方式进行数组的处理
将两个字符串看作两个数组,一个从0地址开始存放,另一个从5开始存放。那么可以用[0+bx]和[5+bx]的方式在同一个循环种定位这两个字符串中的字符。0和5给定了两个字符串的起始偏移地址,bx中给出了从起始偏移地址开始的相对地址。这两个字符串在内存中的起始地址是不一样的,但是,它们中的每一个字符,从起始地址开始的相对地址的变化是相同的。
assume cs:codesg,ds:datasg
datasg segment
db 'BaSic'
db 'iNfOr'
datasg ends
codesg segment
start: mov ax, datasg
mov ds, ax
mov bx, 0
mov cx, 5
s: mov al,