在汇编语言中,要实现大小写字母的转换,我们得先分析一下大写字母和小写字母的ASCII码,通过比较可以发现,大写字母和小写字母之间二进制的区别就是第6位1还是0,如果是大写字母第6位为0,如果是小写字母,第6位则为1,举个例子:A的二进制表示为:0100 0001,a的二进制表示为:0110 0001,通过对比可以发现,它们的区别就是第六位是一还是0。大写字母的第六位为0,小写字母的第六位为1。知道这个就好办了:
如果要转换成大写字母,则使用and指令把ASCII码的第6位置0;
and al,11011111B
如果要转换成小写字母,则使用or指令把ASCII码的第6为置1。
or al,00100000B
下面把程序中给出的三个字符串的小写字母转换为大写字母:
汇编代码
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
| assume cs:codesg,ds:datasg,ss:stacksg datasg segment db 'abc ' db 'lib ' db 'dos ' datasg ends
stacksg segment dw 0,0,0,0,0,0,0,0 ;定义一个段,用来做栈段,容量为16个字节 stacksg ends
codesg segment
start:mov ax,stacksg mov ss,ax mov sp,16 mov ax,datasg mov ds,ax mov bx,0
mov cx,3 ;外层循环三次,对应为数据段中的三个字符串 s0: push cx ;将外层循环的cx值压栈保存 mov si,0 mov cx,3 ;内层循环三次,对应为数据段中给出的每个字符串的三个字母
s: mov al,[bx+si] ; and al,11011111b ;使用and把小谢字母转换为大写字母 mov [bx+si],al ;重新保存到内存单元中 inc si ;si加1,继续循环修改下一个字母 loop s
add bx,16 ;把bx加上16指向下一个字符串所在的地址 pop cx ;从栈顶弹出原来的cx值,恢复cx loop s0
mov ax,4c00h int 21h
codesg ends end start
|
这样就实现了汇编中的大小写字母的转换。