大小写转换
规律:大写字母的ASCII值+20H=小写字母的ASCII值。在ASCII值中,大写字母第5位为0,小写字母第5位为1。所以通过and、or指令可以方便地进行大小写转换,而不需要提前判断字母的大小写。
如:将al中的字符改为大写字母的方法:and al,11011111B
将al中的字符改为小写字母的方法:or al,00100000B
实验6
将datasg段中的每个单词的前4个字母改为大写字母。
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display ' 每个字符串的长度刚好是16字节
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax 初始化数据段
mov ax,stacksg
mov ss,ax
mov sp,10h 初始化栈段
mov bx,0
mov cx,4 一共4行
s: mov si,3 每一行中的第一个起始字符的下标
push cx 将外层的循环次数入栈
mov cx,4 每一行共计4个字符需要改动
s0:mov al,[bx+si]
and al,11011111B
mov [bx+si],al
inc si
loop s0
pop cx 将外层的循环次数出栈
add bx,10h
loop s
mov ax,4c00h
int 21h
codesg ends
end start
做一点小改动
将datasg段中的每个单词改为大写字母。(提示:空格的ASCII值为20h,要用到前面讲过的条件转移指令jcx或je)
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display ' 每个字符串的长度刚好是16字节
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax 初始化数据段
mov ax,stacksg
mov ss,ax
mov sp,10h 初始化栈段
mov bx,0
mov cx,4 一共4行
s: mov si,3 每一行的第一个字符起始地址为3
push cx 将外层的循环次数入栈
s0:mov cl,[bx+si] //mov al,[bx+si]
mov ch,0
sub cx,20h //cmp al,20h 判断是否为空格字符
jcxz done //je done 如果是的话表示本行的所有字符都已经转换过了,进入下一行
mov al,[bx+si]
and al,11011111B
mov [bx+si],al
inc si
jmp short s0
done:pop cx 将外层的循环次数出栈
add bx,10h
loop s
mov ax,4c00h
int 21h
codesg ends
end start