计算机程序设计艺术学习笔记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 (索引寄存器)一个有6I-register,每个2字节和一个标志位

J-register(跳转寄存器) 两字节,

rA主要用于数据的计算操作,rX主要是给rA寄存器扩展使用。从右边扩展rArI主要是用于计数和指向变量内存。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 LDAload AC=8F=field

rA中的数值,用地址指向的数值替换。

例如:

2000地址中的内容是 - 80 3 5 4 

运行指令:LDA  200035)后

Ar中的内容是+ 00 3 5 4- 80 没有包含在field

l LDXload X) C=15F=filed

rX中的数值,用地址指向的数值替换。

l LDiload iC=8+iF=field

rIi中的数值,用地址指向的数值替换。

l LDANload A negativeC =16;F=field.

l LDXNload X negative) C=23 ;F=field.

l LDiN (load i negative) C=16+i;F=field.

 

后三个指令,从字面上也能看出与前三个的区别,同样是载入数据功能,只是数据载入后符号位变取反。

 

存值操作

l STAstore A)。C=24;F=field

rA的数据,存放到对应地址的内存的指定位置中。从rA的右侧开始放入指定位置。有多少位置就放多少,余下的舍弃。

例如:

rA中的数据是:+ 6 7 8 9 0

2000中数据是:- 1 2 3 4 5

STA 20002:4)指令执行后。rA的数据只能放到2-4之间的位置,所以讲 8 9 0 三放入。

2000中数据是:- 1 8 9 0 5

 

l STXstore XC=31:F=field

l STistore iC=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(55)

2000号地址中的第五个字节加到rA

l SUB(subtract) C=2;F=field

rA中的数值减去VV指的是对于地址中的值。如上面例子中的2000(5:5)

l MUL(multiply)C=3;F=field

这是要用到rX了,乘上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看的时候感觉一丢丢,总结起来好多啊,打得我着实蛋疼。)

基本的操作差不多了,下面还有一些操作,下次有空整理。累死了。

原文地址:https://www.cnblogs.com/MitiskySean/p/3482251.html