最近学习了一下8086的16位汇编语言,学习了一种比较奇葩的进行字母大小写转换的方法。
不必用CMP语句进行判断,一步到位。当然前提要求是输入的数据必须是字母哈。
把字母的ASCII码用二进制查看:
大写 16进制 二进制 小写 16进制 二进制
A 41 0100 0001 a 61 0110 0001
B 42 0100 0010 b 62 0110 0010
C 43 0100 0011 c 63 0110 0011
D 44 0100 0100
...
Z 5A 0101 1010 z 7A 0111 1010
明显的,小写的ASCII值 = 大写的ASCII值 + 20H
而且,小写的和大写的在第5位是完全不同的,大写的恒为0, 小写的恒为1
于是,可以用位运算。
assume cs:code, ds:data
data segment
db 'baSiC'
db 'InFOinTion'
data ends
code segment
start: mov ax, data
mov ds, ax ;数据域对应data
mov bx, 0
mov cx, 5
s: mov al, [bx]
and al, 11011111b ;转换成大写
mov [bx], al
inc bx
loop s
mov bx, 5
mov cx, 10
s1: mov al, [bx]
or al, 00100000b ;转换成小写
mov [bx], al
inc bx
loop s1
mov ax, 4c00h
int 21h
code ends
end start
对应的C++语言:
#include <cstdio>
using namespace std;
int main()
{
char a[9] = "aBcdeFGh";
char b[9] = {0};
char c[9] = {0};
for (int i=0; i<9; i++)
b[i] = a[i] & 0xDF; //转换成大写
for (int i=0; i<9; i++)
c[i] = a[i] | 0x20; //转换成小写
return 0;
}