我的电脑生涯(2):ASCII码

标签:
ascii汇编语言 |
分类: 电脑与智能手机 |
上一篇讲到了当时我编写程序的过程,可以看出,当时的编程是极其艰难的,写程序要用机器码,手边要放一本指令集,不时查看每条指令的用法和对应的二进制数字,很累。
如果能用英文字母的缩写来写程序而不用机器码,就会容易得多,例如:“LD A,008” 代表把地址为008的内存数据取到A寄存器里,就很直观。这种编程的写法被称为汇编语言,是计算机语言里最初级的一种。
用这样的汇编语言来写好程序后,为了让机器执行,我们对照指令表把它翻译成机器代码再穿成纸带使用,那么虽然写程序容易些了,但是还是不方便。有一个更方便的方法,就是写好程序后,在纸带穿孔机上输入时,直接就输入“LD A,008”这样的句子,把翻译的工作交给机器去做,这多好!
作为搞电脑工作的人,时刻要记住,自己身边就有一个机器作为助手,因此凡事都应该想到让它帮自己做。
这样做,需要解决两个问题:用汇编语言写好的程序如何在纸带上穿孔?再如何将它翻译为机器代码?
1)用汇编语言写好的程序如何在纸带上穿孔?
上篇文章说过,纸带穿孔机很像一架老式的英文打字机,它的键盘和英文打字机是一样的。所以,在键盘上敲击“LD A,008”这样的句子是不成问题的,但是在穿孔纸带上如何表示这个句子呢?这就需要一个穿孔代码的约定,怎样的孔算字母A,怎样的孔算逗号,等等。这个约定,就是ASCII码。
ASCII,就是American Standard Code for Information Interchange的缩写,即美国信息互换标准代码,下图是ASCII代码表。
从表中我们可以看到,十六进制代码20H表示键盘上的空格键(即上表中十进制是32而字符栏是空白的那个),从这个空格开始直到7EH为止(即十进制是126的~),都是键盘上的字符键,如果用打字机打出来,都是可见的文字和符号。这些可见字符不算空格在内一共是94个。
使用过机械式英文打字机的人都知道,当一行字符快打完的时候,打字机会发出“叮”的一声铃响,提醒打字员别再不停地击键了,否则字符就打到纸外面去了。此时,打字员要用手把打字机的滑车推到最左边,这个动作称为“回车”。仅仅回车是不够的,如果此时打字员继续打字,字符就会重叠在刚才已经打过字的这一行上面,所以打字员还要用手把纸卷滚筒向前转一下,这个动作叫“换行”。打字的时候如果需要退回去,有个键叫“退格”键,按它可以一格格向后退。
对于上述这些动作,在ASCII码表里,都给了相应的代码,例如响铃码是07H,回车码是0DH,换行码是 0AH,退格码是08H,等等。上表中从01H到1FH这些代表动作的代码,被称为控制码。
如果有两架英文打字机分别放在两地,有人在甲机上操作,然后把这些操作用ASCII码记录下来,把这些ASCII码传递给乙机,乙机只要按这些代码行动,它所打出的字符就会和甲机完全一样。换句话说,只要记录下ASCII码的顺序,就等于记录下了要打印的文章内容及其格式,因此,如果用ASCII码传递电报内容,在电报的接收方可以很忠实的还原出原文来,由于发电报的时候还有其它一些控制信息,所以ASCII代码表中有一些用于电报通信的代码。
从上面的码表可以看出,控制码和可见字符码加起来,正好用7位二进制数可以囊括。所以用纸带穿孔的话,7个孔就够用了,另一个孔就用作奇偶校验,使得读取数据时更加可靠。
上一篇文章说过,无孔的纸带,其对应的码就是00H,如果这一排孔全都穿了洞,这排就是作废了,因此7FH就是作废的意思。一条8孔的纸带,每排刚好能表示一个ASCII字符,所以只要纸带穿孔机按这个码表的约定来穿孔,那么在键盘里输入“LD A, 008”这个句子后,自然就可以穿出有这串代码的纸带来了。举例说,当你键入L这个字母的时候,纸带上穿出的孔就是4CH,即1001100这7个(3个1代表有孔4个0代表没孔)。
由此可见,穿孔机不是简单地穿孔,它内含了一个变换的功能,即按ASCII码表把你按的键变成相应的代码孔。正是穿孔机具备了这样的能力,所以用它可以把用汇编语言写好的程序穿成纸带。
刚开始的时候,这个码表是美国国家标准,后来全世界都采用了这个标准,变成了国际标准,称为ISO
646。事实上,除了英文外,法文或者其它语言,有些字母和英文并不完全相同,所以ISO
646以ASCII为基础,但是又允许各国根据本国的文字情况做一些小的调整。
附录:如何看懂ASCII码表
这篇文章写完后,有朋友说看不懂,说穿了就是看不懂这个码表,下面我来做些解释。
假如有一串二进制数字是这样的:0100 1011 1100 1010,那么,念起来是否太长太拗口?还记不住?所以,人们就换一种方法来叙述它。先看下面这个表:
二进制数
这个表的最左栏是二进制数,第二栏是它们对应的十进制数,第三栏是对应的十六进制数。例如,十六进制数B,就是十进制的11。那么,前面的那长串二进制数,用十六进制来读,就是4BCA,是不是很容易了?十六进制数,在9以前,和十进制是一样的,从10开始到15,变成了ABCDEF,也不难记。(逢16进1 。因此,十六进制的21,就是2个16再加1等于33 。)
现在再回过头来看这个ASCII码表,里面的字母L,对应的十六进制数是4C,那么对照上面这个表看,它的二进制数就是 0100 1100,如果要穿孔成纸带,其中三个1就对应穿孔,但是,如果我们聊天的时候,就不说01001100这么长,就只需说,4C。又如,如果我们在键盘上按一个空格键,那么用ASCII码的十六进制说,就是20,如果用十进制说,就是32 。又是20,又是32,容易搞混淆了,所以如果要提到十六进制,就在数字后面加一个H,表示这不是十进制而是十六进制。那么,空格的ASCII码,就是20H 。
上面的那个句子“LD
A,008”,我们敲击键盘的时候,就依次键入:L、D、空格、A、逗号、0、0、8,于是对应的ASCII码就是
4CH,44H,20H,41H,