一, 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 |
|

|