为M-3机器编写程序,需要依据该机器厂家提供的机器指令来进行,每条指令中无论是数据还是操作码,全部都是0和1的串。
M-3机每条指令都由操作码和操作数组成。操作码8个二进制位。操作数有两个,分别表示内存地址,各占12个二进制位。
每条指令的三个域共32个二进制位,与M-3机内存单元长度一致。所有操作码和操作数都是数字。如
0000010002
00表示做加法,把0001单元的内容与0002单元内容相加,将结果送往寄存器By,然后回存到0002单元。
这条指令送到内存就是:
00000000000000000010000000000010
指令从功能上分为:算术运算、逻辑运算、代码传送、控制指令、停机五种。指令地址要自己分配,该机器只有数字类型数据,程序只能做数字计算。
指令集是厂家提供给编程人员,用来编程的指令格式规范。计算机有了指令集,只表示计算机有了潜在的计算能力。要计算机做事就必须编写程序,组织一个指令序列。
由指令序列构成的每个程序,其中全部都是0和1,在纸面上规定用8进制书写,因此全部是数字0-7。并且为每个操作码和操作数分配存储单元。再用传送指令把它从穿孔纸带上预存到指定的存储单元中,以后通过地址操作从该单元取用。
举一个用M-3机器指令编程的例子,试编写求以下表达式的值的程序:
f=((x²y²-z²)sinx)/(x²y²)①
其中sinx用近似式x-x²/6表示(-1<x,1<x,y,z<1)。因为M-3是定点机,所有初始数据,中间结果以及最后结果的绝对值都必须小于1,大于0.5,为使数值不溢出,先要把计算式改写为
f=((x²/2y²/2-z²/2)sinx)/(x²/2y²/2)②
接着程序员要给指令和数据分配地址,对内存做出规划,假定把初始数据x,y,z分别存放在0024-0026号单元中,1/2,-1/6分别存放在0027、0030单元,程序则从0005号单元开始,至0023单元。程序如下:
指令地址 | 操作码 | A1 | A2 | 说明 |
0005 | 13 | 0025 | 0025 | y²→寄存器B |
0006 | 23 | 0027 | 0001 | y²/2→0001 |
0007 | 13 | 0026 | 0026 | x²→B |
0010 | 23 | 0027 | 0002 | z²/2→0002 |
0011 | 13 | 0024 | 0024 | x²→B |
0012 | 33 | 0027 |
| x²/2→B |
0013 | 20 | 0001 | 0001 | x²/2y²/2→B→0001 |
0014 | 31 | 0002 |
| x²/2y²/2-z²/2→B→0001 |
0015 | 22 | 0001 | 0002 | 上述②式→B→0001 |
0016 | 13 | 0024 | 0024 | x²→B |
0017 | 33 | 0030 |
| x²/6→B |
0020 | 33 | 0024 |
| -x²/6→B |
0021 | 30 | 0024 |
| x-x²/6→B |
0022 | 63 | 002 | 002 | f→B→0002→π |
0023 | 77 |
|
| Ω(停机) |
上述程序最左边列是由程序员安排的内存地址,最右边列是说明,两列都不属于程序内容,不需要输入。输入给机器的八进制程序代码部分如下:
1300250025
2300270001
1300260026
2300270002
1300240024
330027
2000010001
310002
2200010002
1300240024
330030
330024
300024
63002002
77
到了机器内部,上述程序将被全部转化为二进制代码。
这个阶段的程序中,每条指令都是机器能够直接识别的。程序的结构,指令的格式都有规范,地址操作数不能越界,数据不能溢出,后来也把这个阶段的程序设计叫做机器语言程序设计。
机器语言虽然笨拙,但它能存储程序和数据并以电子速度自动执行程序,执行速度很快,原始数据和加工结果又能存储,程序可以重复执行,中间无需人员干预,计算机又可依照编程的逻辑,自主地执行程序,直至算出结果。中间还省去了纸和笔。这是计算机生命力之所在,也是计算领域革命性之所在。
2DJS21机(121机)的数据、指令和程序
1965年起,DJS21机总共生产了130台,是我国最早进行批量生产的晶体管计算机,因此可当作是我国第二代机器的代表。DJS分别是汉语拼音电子、晶体管、数字三个词的开头。
DJS130机
121机采用一地址指令系统,每条指令都是在操作码Q后只带一个地址操作码D。
Q有6个二进制位,可以区别2^6=64种不同的操作,恰好能够区分121机的59条指令。14位操作数可以表示2^14=16384个内存单元地址。ε是变址特征位,当它为0时,该条指令直接对内存地址D进行操作;为1时,所施加的操作要对“Dε”的一个新地址进行。
约定用十六进制数书写指令。下面根据操作码粗略看看121机的部分指令。
01-05 | 传送指令 | 用于内在和寄存器间传送数据和指令 |
07-0F | 算术运算 |
|
10-12、17 | 逻辑运算 |
|
13-16 | 比较指令 |
|
20-26、34-35 | 转换指令 |
|
2D | 电传打字 |
|
2E | 光电输入 |
|
2F | 打印 |
|
33 | 访问磁鼓磁带 |
|
3F | 停机指令 |
|
其他还包括送地址指令,移位指令,用于阶码操作的指令,将数规格化的指令,用于支持变址寻址的指令等。
3ALGOL60语言
1960年,欧洲人确定了ALGOL60编程语言,其编译系统可以引进到121机上。
ALGOL,为算法语言(ALGOrithmicLanguage)的缩写,是计算机发展史上首批产生的高级程式语言家族。当时还是晶体管计算机流行的时代,由于ALGOL语句和普通语言表达式接近,更适于数值计算,所以ALGOL多用于科学计算机。
ALGOL60可以说明变量,一个变量对应一个数学量,跟人们的数学习惯相吻合。程序中使用变量名,避免了直接与内存单元和寄存器打交道的枯燥易错。编译程序会自动为每个变量名分配内存单元并对应内存地址。
ALGOL60也引入了函数,并提供了24条标准函数,用户自己也可以编写函数。
ALGOL121的编译程序由一个80行的引导程序加载到内存。
ALGOL的数据类型中没有字符型,没有文件概念。
穿孔纸带上的当前位置用5个孔位的编码表示一个数字或字母。是字母还是数字由两个键进行相应的切换。
纸带格式有如下的严格要求:
空白 | 要1米以上 |
Y源程序 | 源程序开始 |
5个以上字母键 | 表示区域结束 |
S数据 | 数据开始 |
5个以上字母键 | 表示区域结束 |
空白 |
|
GY源程序 | 改正后的源程序行 |
GS数据 | 改正后的某些数据 |
空白 |
|
J | 结束 |
空白 | 要2米以上 |
4BASIC语言
BASIC是继FORTRAN、ALGOL60后于1964年推出的第三个高级程序设计语言,这个语言一部分基于FORTRAN,一部分基于ALGOL60,并且增加了一些东西使之适合于分时系统。
BASIC以简单易用和解释执行为特点,在计算机初学者中广为流行。
BASIC强化了字符串操作和文件操作。新增了图像和语言功能,可以在屏幕上打点、画线、着色,还可以利用beep和sound语句让内置喇叭发声。
BASIC还有一些特殊功能,比如“onkey(n)gosub行号“可以重新定义功能键Fn的功能,这实际上是优先处理键盘中断的功能。
每一行的代码前面都有一个整数数字作为“行号”。行号是按顺序执行的依据,也是GOTO转向的标号。
BASIC中没有while、for等流程控制结构设计,只能使用GOTO语句控制流程转向。BASIC中GOTO语句有3种格式,一种是强行转,格式“GOTO行号”,强制转向指定的语句行。第二种是条件转,格式“IF条件表达式THENGOTO行号“,表达式成立就转向指定的语句行。第三种是多路开关转,格式”ON算术表达式GOTO行号1,行号2,…“将根据表达式的值为1,2,…分别转向行号1,行号2等处。
5C、C
到了C语言,有了控制结构,数据自定义类型结构体等。到了C,结构体中可以包含函数,类如同基本数据类型一样,可以集合一组数据及数据之上的运算。