像这样一段字符串:
$$
H e l l o , y o u !
$$
转换成ASCII码,用十六进制数表示如下:
$$
4 8 6 5 6 C 6 \mathrm { F } 2 \mathrm { C } 2 0 7 9 6 \mathrm { F } 7 5 2 1
$$
这段编码中,除了普通的字符,逗号(编码2C)、空格(编码20)和感叹号(编码21)容易遗漏,需要额外注意。我们再来看一个例子:
$$
I a m \ I 2 y e a r s o l d .
$$
它用 ASCII 码表示为:
49 20 61 6D 20 31 32 20 79 65 61 72 73 20 6F 6C 64 2E
有意思的是数字12的表示方法。在这段编码串中,它被表示成十六进制数31h和32h,也就是数字1和2的ASCII码的组合。当数字12以文本流的身份出现时,不应该用十六进制码 01h和 02h,或者BCD码12h,或者0Ch来表示。因为这些编码在 ASCII码中表示其他的意思。
在 ASCII码中,一个大写字母与其对应的小写字母的ASCII码值相差20h。这种规律大大简化了程序代码的编写,例如一段将特定的字符串变成大写的程序。假设有一个字符串存放在内存的某个区域,每个字符占据一个字节。下面是一段8080子程序,初始状态下字符串的首地址存放在寄存器HL中;寄存器C存放字符串的长度,也就是字符的个数。
Capitalize: MOV A, C ;c表示剩余的字符数CPI A, 00h ;与0进行比较JZ AllDone ;如果剩余的字符数为0,程序结束MOV A, [HL] ;取得下一个字符CPI A, 61h ;判断A代表的字符的ASCII码是否比a'小JC Skipit ;如果比a'小,就跳过CPI A, 78h ;判断是否比′z′大JNC SkipIt ;如果是,则跳过SBI A, 20h ;判断是否是小写,如果是,则减20hMOV [HL], A ;保存修改过的字符
SkipIt: INX HL ;指向下一个字符DCR C ;计数器减一
20 ASCII 码和字符转换
315