一, mix
尽管knuth对于mix不満,在第3版和他本人的主页上声明即将更换为mmix,但对于初学者如我而言,结全本书先学学mix似乎更为方便,为了学习tacop后面的内容,了解一下mix看来是必须的步骤。
命令格式一般为
OP ADDRESS,I(F)
OP为命令关键字,ADDRESS 为地址,I为变址寄存器,F 为字节描述。
格式也可能为:OP ADDRESS(F),这一点knuth没提,但不要求变址时不写I部分是很正常的,knuth却没想到菜鸟如我者却在开始动不动以为省掉的是ADDRESS.
至于有时可以省掉F 部分是很好理解的,knuth有说明。
装入操作符,(LDA等)存储操作符(STA 等),注意,F部分描述的是内存地址的而不是寄存器的字节,这一点我也糊涂了半天。 装的时候顺序是从低往高。
算术运算符:add ,sub , mul ,div
只与rA有关。 与rA和rX都有关。
地址传送操作(ENTA ,INCA ,DECA,等)后面的address部分描述的address 而是数字。
比较操作符:比较的是寄存器和内存的值。
MOVE 由单元M开始移到r1的内容所指的单元,次数为F所指定,事后r1加上F的值。
NUM,将字符代码变为数值代码,M被忽略,n1成1,n2成2,
CHAR,不是NUM的反运算,在n前加3,影响rA和rX.
注意:rX是rA的右边补充。
习题详析:
STZ 1 |
地址1清0 |
ENNX 1 |
rX=-1
|
STX 1(0:1) |
地址1 |
SLAX 1 |
rA rX |
ENNA 1 |
rA=-1 |
INCX 1 |
rX |
ENT1 1 |
r1=1 |
SRC 1 |
rA rX
|
ADD 1 |
rA overflow |
DEC1 -1 |
r1=2; |
STZ 1 |
地址1清0 |
CMP 1 |
比较rA和地址1, 相等,因为正0和负0相等。 |
MOV -1, 1(1) |
将地址1的内容移到地址2(由r2指定)。只移这一个,事后r2=3; |
NUM 1 |
10000=2*64*64+28*64+16
rA rX
|
CHAR 1 |
- |
30 |
30 |
30 |
30 |
30 |
- |
31 |
30 |
30 |
30 |
30 |
rA rX |
HLT 1 |
|

|