计算机程序设计艺术学习笔记1
MIX的学习
这应该是第三次看这本书吧。说实话前两次没怎么看下去,能力不足是主要原因,还有就是没有太多的时间来深入研究这本书。
现在,大四了,虽然很迷茫为了要做个啥,但无所谓了,反正与其抓耳挠腮地迷茫,不如静下心来读书吧。刚好趁着这个时间,来读下这边巨著。
这套书是在亚马逊打折的时候买的,是个全英文版本的。不知道是心理原因还是实际就如此,觉得有些比其它书要重。
此次学习,我选择了MIX,前面内容没课是因为以前看过,像上了点新鲜的东西。
学过点汇编的应该看着都没什么问题。
这儿我有个非常巨大的疑问?为什么作者要自己设计一种语言呢?书中的一句话:the language of MIX has been designed to be powerful enough to allow brief programs to be written for most algorithms。让我想起了UNIX时代许多大牛会为自己的软件设计些恰到好处的内在语言,这些可以让软件使用更方便,但是学习时间长。我觉得是这个原因让作者设计了一个MIX吧。
MIX的寄存器:
A-register (累加器)五个字节和一个标志位(每个字节只有6位,文中也说了这与现在的8位不同)
X-register (扩展寄存器)五个字节和一个标志位
I-register (索引寄存器)一个有6个I-register,每个2字节和一个标志位
J-register(跳转寄存器) 两字节,
rA主要用于数据的计算操作,rX主要是给rA寄存器扩展使用。从右边扩展rA。rI主要是用于计数和指向变量内存。rJ简简单单跳转用的。
部分字段
可以通过(L:R)来表示一个字的一部分(五位加一个标志位)。L是左边的开始位置,R是右边结束位置,LR中间的是可用部分。通常通过8*L+R的结果来表示。
比如13,表示(1:5)也就是第1位到第五位的全部数据。
指令格式
0 |
1 |
2 |
3 |
4 |
5 |
-/+ |
A |
A |
I |
F |
C |
l C是表示操作的。比如8,代表LDA,意思是载入到Ar中。
l F是表示8*L+R那个值
l -/+AA是表示地址
l I中的数组是0-6,如果是0那个-/+AA表示的数据不变,如果是1-6,意味着-/+AA数据在运算前会加上相应的Ir中的数据。
此外,在指令中M表示地址,CONTENTS(M)表示的是地址对于的内容。
书写格式(notation)
这个地方的翻译找的中文书,书上写着记号,我感觉不妥。根据第一句话:to discuss instructions in readable manner, we will use the notation to denote an instruction above。这就有点像汇编指令,和机器内码的关系。
格式为:OP ADDRESS , I(F)
其中:
u OP对于这指令中的C
u ADDRESS 是指令中的-/+AA
u I是指令中的I
u F是指令中的F
取值操作
下面将逐个介绍各自操作,也就是对应指令中的C。有点汇编知识的基本没问题。
l LDA(load A)C=8;F=field。
将rA中的数值,用地址指向的数值替换。
例如:
2000地址中的内容是 - 80 3 5 4
运行指令:LDA 2000(3:5)后
Ar中的内容是+ 00 3 5 4。- 80 没有包含在field中
l LDX(load X) C=15;F=filed
将rX中的数值,用地址指向的数值替换。
l LDi(load i)C=8+i;F=field
将rIi中的数值,用地址指向的数值替换。
l LDAN(load A negative)C =16;F=field.
l LDXN(load X negative) C=23 ;F=field.
l LDiN (load i negative) C=16+i;F=field.
后三个指令,从字面上也能看出与前三个的区别,同样是载入数据功能,只是数据载入后符号位变取反。
存值操作
l STA(store A)。C=24;F=field
将rA的数据,存放到对应地址的内存的指定位置中。从rA的右侧开始放入指定位置。有多少位置就放多少,余下的舍弃。
例如:
rA中的数据是:+ 6 7 8 9 0
2000中数据是:- 1 2 3 4 5
STA 2000(2:4)指令执行后。rA的数据只能放到2-4之间的位置,所以讲 8 9 0 三放入。
2000中数据是:- 1 8 9 0 5
l STX(store X)C=31:;F=field
l STi(store i)C=24+i;F=field
l STJ(store J) C=32;F=field
l STZ(store zero) C=33 ;F =field
除了最后一个,其他都与STA差不多的操作,只是针对不同寄存器。
最后一个,其实就是将指定内存清零。
算术操作
l ADD C=1;F=field
将数据加上rA,然后存到rA中。如果数值过大,超过了rA的范围,那么溢出位将会被设为on。就如果在rA前面有个虚拟的1,这样数值就表示正确了。
例如:
ADD 2000(5:5)
将2000号地址中的第五个字节加到rA中
l SUB(subtract) C=2;F=field
rA中的数值减去V,V指的是对于地址中的值。如上面例子中的2000(5:5)
l MUL(multiply)C=3;F=field
这是要用到rX了,V 乘上rA,多出的放到rX中,注意rX是在rA的右边,也就是数据的地位。
l DIV(divide) C=4;F=field
好像没得说,做除法。
地址转移操作
l ENTA(enter A) C=48;F=2
将数据载入rA中,有点像LDA操作。
例如:
ENTA 0 :意思是个rA设置为零
ENTA 0,1:意思是将rIi的数据载入rA中,但是-0变成+0
l ENTX(enter X) C=55;F=2
l ENTi(enter Ii) C=48+i;F=2
与ENTA类似。
l ENNA(enter negative A) C= 48;F=3
l ENNX(enter negative X) C=55;F=3
l ENNi(enter negative i)C=48+i;F=3
后三个指令与前三个指令功能相同,但是数据符号位会取反。
l INCA(increase A) C=48; F=0
“INCA 1” 每次rA中增加1
l INCX(increase X) C=55;F=0
l INCi(increase i) C= 48+i F=0
与INCA类似
l DECA(decrease A) C=48;F=1
l DECX(decrease X) C=55;F=1
l DECi(decrease i) C=48+i;F=1
与INC相似,不过这个是减去,而不是加上。
比较操作
l CMPA(compare A) C=56;F=field
rA和指定内存中的数据进行比较。
l CMPX(compare X)C=63;F=field
rX和指定内存中的数据进行比较。
l CMPi(compare i) C=56+i;F=field
rIi和指定内存中的数据进行比较。
跳转操作
l JMP(jump) C=39 ;F=0
无条件跳转。
l JSJ(jump, save J) C=39;F=1
无条件跳转,但是rJ的内容不变
l JOV(jump on overflow)C=39;F=2
溢出位开(on)的时候跳转。
l JNOV(jump on no overfolw)C=39;F=3
溢出位为关(off)的时候跳转
l JL,JE,JG,JGE,JNEJLE(jump on less,equal,greater - or - equal, unequal, less - or - equal)C=39;F=4,5,6,7,8,9 与操作一一对应。
比较标志位满足上述指令条件时跳转。
l JAN,JAZ,JAP,JANN,JANZ,JANP(jump A negative,zero , positive ,nonnegative,nonzero,
Nonpositive)C=40;F=0,1,2,3,4,5,一一对应。
在rA中数据满足指令对应的条件时跳转。
l JXN……与上同,只是对于rX的跳转指令
l JiN……与上同,只是对于rIi的跳转指令
(T..T看的时候感觉一丢丢,总结起来好多啊,打得我着实蛋疼。)
基本的操作差不多了,下面还有一些操作,下次有空整理。累死了。