分类:
2009-11-05 21:57:35
[转载] 原文地址:http://blog.chinaunix.net/u/9831/showart_68987.html
Loading operators
LDA (load A). C=8; F=field.
用CONTENTS(M)中的指定域替换掉寄存器A中之前的内容。对于所有以部分域为输入的操
作而言,如果指定域包含符号则使用它,否则将使用+号。在加载的时候,指定域是向
寄存器的右边对齐的。
首先验证第一卷129页的例子:
code : LDA 2000
2000 : - 01 02 03 04 05
rA : - 01 02 03 04 05 没有指定域的时候就相当于指定了全部的域,因此目
的地中包括符号在内的全部字节都将设置为源地址中
的内容。
code : LDA 2000(1:5)
2000 : - 01 02 03 04 05
rA : + 01 02 03 04 05 (1:5)指定了除符号之外的其余5个字节的内容,由于
没有包括符号,目的地中的符号将依然保持为+号。
code : LDA 2000(3:5)
2000 : - 01 02 03 04 05
rA : + 00 00 03 04 05 (3:5)指定了最右边的三个字节,不影响符号。
code : LDA 2000(0:3)
2000 : - 01 02 03 04 05
rA : - 00 00 01 02 03 (0:3)指定了最左边的三个字节外加一个符号,因此
会改变目的地中的符号,而其余三个字节则在目的地
中将向右对齐。
code : LDA 2000(4:4)
2000 : - 01 02 03 04 05
rA : + 00 00 00 00 04 (4:4)只指定了左数第4个字节,同样,这个字节在目
的地中也会向右对齐存放。
code : LDA 2000(4:4)
2000 : - 01 02 03 04 05
rA : - 00 00 00 00 00 (0:0)只指定了符号,因此只会改变目的地的符号,
而不会影响其它字节的内容。
code : LDA 2000(1:1)
2000 : - 01 02 03 04 05
rA : + 00 00 00 00 01 (1:1)只指定了第1字节,因此不会影响符号,只会将
源地址中的这个字节向右对齐存放在目的地中。
LDX (load X). C=15; F=field.
和LDA类似,只不过加载的是rX而不是rA。
LDi (load i). C=8+i; F=field.
和LDA类似,只不过加载的是rIi而不是rA。rIi系列寄存器只包含两个字节和一个符号,
第1、2、3字节总是假定为0的。
LDAN (load A negative). C=16; F=field.
LDXN (load X negative). C=23; F=field.
LDiN (load i negative). C=16+i; F=field.
这8个指令分别和LDA、LDX、LDi类似,只不过加载时要把符号取反。
Storing operators
STA (store A). C=24; F=field.
用rA中的部分内容替换掉CONTENTS(M)中由F指定的域的内容。F在存储操作中的含义和
在加载操作中的含义相反:根据F计算出字节数,从寄存器A的右边取出相应的字节,再
把这些字节写入目的地中由F指定的域中。
验证第一卷130页的例子:
2000地址单元中的当前内容为2000: - 01 02 03 04 05,寄存器A中的内容为
rA: + 06 07 08 09 00。
code : STA 2000
rA : + 06 07 08 09 00
2000(1): - 01 02 03 04 05
2000(2): + 06 07 08 09 00 寄存器A中的内容将2000地址单元完全覆盖。
code : STA 2000(1:5)
rA : + 06 07 08 09 00
2000(1): - 01 02 03 04 05
2000(2): - 06 07 08 09 00 (1:5)不会影响到符号。
code : STA 2000(5:5)
rA : + 06 07 08 09 00
2000(1): - 01 02 03 04 05
2000(2): - 01 02 03 04 00 (5:5)只选择了一个字节,因此取出寄存器A的第5
字节存入目的地的第5字节中。
code : STA 2000(2:2)
rA : + 06 07 08 09 00
2000(1): - 01 02 03 04 05
2000(2): - 01 00 03 04 05 (2:2)只选择了一个字节,因此取出寄存器A的第5
字节存入目的地的第2字节中。
code : STA 2000(2:3)
rA : + 06 07 08 09 00
2000(1): - 01 02 03 04 05
2000(2): - 01 09 00 04 05 (2:3)选择了两个字节,因此取出寄存器A的第4、5
字节,存入目的地的第2、3字节中。
code : STA 2000(0:1)
rA : + 06 07 08 09 00
2000(1): - 01 02 03 04 05
2000(2): + 00 02 03 04 05 (0:1)除符号之外只选择了一个字节,因此取出寄
存器A的第5字节存入目的地的第1字节中,同时修
改符号。
STX (store X). C=31; F=field.
和STA类似,只不过存储的是rX而不是rA。
STi (store i). C=24+i; F=field.
和STA类似,只不过存储的是rIi而不是rA。
STJ (store J). C=32; F=field.
和STi类似,只不过存储的是rJ,符号则总是为+。
STZ (store zero). C=33; F=field.
和STA类似,只不过存储的是+0。也就是说,CONTENTS(M)中的指定域将被清0。
Arithmetic operators
缺省的域为(0:5),其余情况参照LDA处理。使用字母V来表示CONTENTS(M)中的指定域,也就
是说,如果操作码是LDA的话,V就是加载到寄存器A中的数值。
ADD. C=1; F=field.
将V加到rA。如果结果超过寄存器A的表示范围,则会设置溢出标志,寄存器中剩余的则
是向左“进1”之后的数值。(否则溢出标志将不会发生改变)。如果结果为0,rA的符
号不会发生改变。
验证第一卷131页的示例程序,假设2000地址单元中的内容为
2000: + 01 02 03 04 05 (0017314053),程序求这5个字节的和。
1 ORIG 2000
2 CON 17314053 寄存器A的内容
3 START LDA 2000(5:5) rA: + 00 00 00 00 05 (0000000005)
4 ADD 2000(4:4) rA: + 00 00 00 00 09 (0000000009)
5 ADD 2000(3:3) rA: + 00 00 00 00 12 (0000000012)
6 ADD 2000(2:2) rA: + 00 00 00 00 14 (0000000014)
7 ADD 2000(1:1) rA: + 00 00 00 00 15 (0000000015)
8 HLT
9 END START
验证溢出的情况,假设2000地址单元中的内容为
2000: + 60 00 00 00 00 (1006632960),程序将这个值和自身相加,这将超过寄存器A
的表示范围。
1 ORIG 2000 寄存器A的内容 溢出标志
2 CON 1006632960
3 START LDA 2000 rA: + 60 00 00 00 00 (1006632960) F
4 ADD 2000 rA: + 56 00 00 00 00 (0939524096) T
5 HLT
6 END START
从上面的结果可以看出,寄存器A中的内容就相当于向左进1之后的剩余数值,而溢出标
志则从FALSE变为了TRUE。
+ 60 00 00 00 00
+ + 60 00 00 00 00
--------------------
+ 01 56 00 00 00 00
SUB (substract). C=2; F=field.
从rA中减去V。
MUL (multiply). C=3; F=field.
V乘以rA,乘积为10字节,存放在寄存器A和X中。rA和rX的符号均被设置为乘积的符号。
DIV (divide). C=4; F=field.
rA和rX的内容被当作一个10字节的被除数rAX,符号采用rA的,除数为V。如果V=0,或
者商大于5个字节(相当于|rA| >= |V|),寄存器A和X将被写入未知的信息,同时还会
设置溢出标志。否则将把商±|_|rAX/V|_|存储在rA中,而余数±|_|rAX|mod|V|_|则存
储在rX中。rA的符号和商保持一致,rX的符号则是rA之前的符号。
验证第一卷132页关于算术指令的几个例子。
rA: + 19 18 01 02 22 (0323489942)
1000: + 01 36 05 00 50 (0026234930)
ADD 1000:--------------------------------
rA: + 20 54 06 03 08 (0349724872)
rA: - 19 18 00 00 09 (0323485705)
1000: - 31 16 02 22 00 (0524297600)
SUB 1000:--------------------------------
rA: + 11 62 02 21 55 (0200811895)
rA: + 01 01 01 01 01 (0017043521)
1000: + 01 01 01 01 01 (0017043521)
MUL 1000:--------------------------------
rA: + 00 01 02 03 04 (0000270532)
rX: + 05 04 03 02 01 (0084947073)
rA: - 00 00 00 01 48 (0000000112)
1000: + 02 01 01 01 01 (0033820737)
MUL 1000(1:1):--------------------------------
rA: - 00 00 00 00 00 (0000000000)
rX: - 00 00 00 03 32 (0000000224)
rA: - 50 00 01 48 04 (0838867972)
1000: - 02 00 00 00 00 (0033554432)
MUL 1000:--------------------------------
rA: + 01 36 00 03 32 (0026214624)
rX: + 08 00 00 00 00 (0134217728)
rA: + 00 00 00 00 00 (0000000000)
rX: - 00 00 00 00 17 (0000000017)
1000: + 00 00 00 00 03 (0000000003)
DIV 1000:--------------------------------
rA: + 00 00 00 00 05 (0000000005)
rX: + 00 00 00 00 02 (0000000002)
rA: - 00 00 00 00 00 (0000000000)
rX: + 19 19 00 03 01 (0323748033)
1000: - 00 00 00 02 00 (0000000128)
DIV 1000:--------------------------------
rA: + 00 09 41 32 01 (0002529281)
rX: - 00 00 00 01 01 (0000000065)
Address transfer operators
ENTA (enter A). C=48; F=2.
将M加载到rA中。这个操作等价于从一个存储着M的带符号值的存储器字中“LDA”。如
果M=0,当前指令的符号将被加载。注意,这个指令的域为2,即(0:2),也就是说,它
将从M中取出符号和第1、2字节的内容(即使用和M相同的符号),但也有例外,如下。
第一卷133页例子的说明:
(1) ENTA 0可以把rA设置为+0。说明:前面已经提到,如果M等于0,那么将使用当
前指令的符号。一般说来,ENTA的符号都是+:
+ 00 00 00 02 48 (0000000176)
因此,不管是ENTA 0还是ENTA -0,rA最终都是+0。如果将这条指令的符号修
改为-:
- 00 00 00 02 48 (0000000176)
则ENTA 0和ENTA -0的结果就都是-0了。
(2) ENTA 0,1则可以把rA设置为rI1的当前值(包括符号),唯一的例外是如果rI1
的值是-0的话,rA将被设置为+0。说明:
rA : + 00 00 00 00 00 (0000000000)
rI1: - 00 01 (0001)
ENTA 0,1:------------------------------
rA : - 00 00 00 00 01 (0000000001)
rA : + 00 00 00 00 00 (0000000000)
rI1: - 00 00 (0000)
ENTA 0,1:------------------------------
rA : + 00 00 00 00 00 (0000000000)
(3) 同样,ENTA -0,1也可以把rA设置为rI1的当前值(包括符号),唯一的例外则
是如果rI1是+0的话,rA将被设置为-0。说明与前例相似。
ENTX (enter X). C=55; F=2.
ENTi (enter i). C=48+i; F=2.
和ENTA类似。
ENNA (enter negative A). C=48; F=3.
ENNX (enter negative X). C=55; F=3.
ENNi (enter negative i). C=48+i; F=3.
和ENTA、ENTX、ENTi类似,只不过加载时符号取反。一些例子:
rA : + 00 00 00 00 00 (0000000000)
ENNA 0 (+ 00 00 00 03 48):------------
rA : - 00 00 00 00 00 (0000000000)
ENNA -0的情况与此相同。
rA : + 00 00 00 00 00 (0000000000)
-ENNA 0 (- 00 00 00 03 48):------------
rA : + 00 00 00 00 00 (0000000000)
-ENNA -0的情况与此相同。
参照ENTA的情况,似乎可以总结出,如果M=0,ENNA将使用和当前指令相反的符号,否
则才会使用和指定数值相反的符号。下面继续参照ENTA继续给出一些验证结果:
rA : + 00 00 00 00 00 (0000000000)
rI1: - 00 01 (0001)
ENNA 0,1:------------------------------
rA : + 00 00 00 00 01 (0000000001)
rA : + 00 00 00 00 00 (0000000000)
rI1: - 00 00 (0000)
ENNA 0,1:------------------------------
rA : - 00 00 00 00 00 (0000000000)
也就是说,如果ENNA的“源”是-0的话,那么“目的”将仍然被设置为-0,而不是+0。
rI1: - 00 01 (0001)
ENN1 0,1:---------------
rI1: + 00 01 (0001)
即,使用ENNi 0,i可以将rIi寄存器的内容取反,但需注意上述例外。
INCA (increase A). C=48; F=0.
将M的数值加到rA上,相当于把一个包含有M的数值的内存单元的内容“ADD”到rA。对
于溢出的处理和ADD一样。
INCX (increase X). C=55; F=0.
将M的数值加到rX上。如果发生溢出,操作和ADD相当,只不过使用的是rX而不是rA。寄
存器A不会被这条指令影响到。
INCi (increase i). C=48+i; F=0.
将M加到rIi。不允许出现溢出的情况。如果M+rIi超过了两个字节的表示范围,该指令
的结果将无法预知。
DECA (decrease A). C=48; F=1.
DECX (decrease X). C=55; F=1.
DECi (decrease i). C=48+i; F=1.
这8条指令分别和INCA、INCX、INCi类似,只不过是从寄存器中减去M,而不是加。
注意:ENTA、ENNA、INCA和DECA的操作码都相同(48),F字段在此用于它们之间的相
互区别。
Comparison operators
MIX的比较操作符都是把一个寄存器中的数值和一个内存中的数值进行比较的。比较指示器
随后被设置为LESS、EQUAL或GREATER。-0是等于+0的。
CMPA (compare A). C=56; F=field.
将rA中的指定域和CONTENTS(M)中的相同域进行比较。如果F不包括符号位置,则参与
比较的两个数值均被认为是非负的,否则符号位也将参与比较。(当F为(0:0)时,比较
结果总是相等,因为-0是等于+0的。)
CMPX (compare X). C=63; F=field.
和CMPA类似。
CMPi (compare i). C=56+i; F=field.
和CMPA类似。索引寄存器的第1、2、3字节在比较中将被视为0。(因此如果F=(1:2)的
话,结果就不可能是GREATER。)
Jump operators
当发生一个典型的跳转时,J寄存器将被设置为下一条指令的地址(指的是假设没有发生跳
转时的下一条指令)。程序员随后就可以使用一条“store J”指令来修改另外一个稍后会
用来返回程序中的最初位置的命令的地址域。只要程序中发生跳转,J寄存器的值就会改变,
除非跳转操作符是JSJ。其它的非跳转指令是不会影响到它的。
JMP (jump). C=39; F=0.
无条件跳转:下一条指令从位置M中取出。
JSJ (jump, save J). C=39; F=1.
除了不会改变rJ的内容之外,和JMP相同。
JOV (jump on overflow). C=39; F=2.
如果溢出标志为on,则将其关闭,然后执行JMP;否则什么事情都不会发生。
JNOV (jump on no overflow). C=39; F=3.
如果溢出标志为off,则执行JMP;否则将其关闭。
JL, JE, JG, JGE, JNE, JLE (jump on less, equal, greater, greater-or-equal,
unequal, less-or-equal). C=39; F=4, 5, 6, 7, 8, 9, respectively.
如果比较指示器的内容和指令所隐含的意义相同则跳转。比如,JNE将在比较指示器为
LESS或GREATER的时候跳转。这些指令不会改变比较指示器的内容。
JAN, JAZ, JAP, JANN, JANZ, JANP (jump A negative, zero, positive, nonnegative,
nonzero, nonpositive). C=40; F=0, 1, 2, 3, 4, 5, respectively.
如果rA的内容满足指定的条件则跳转,否则不会发生任何事情。“positive”的意思是
大于0(不等于0),“nonpositive”的意思相反,表示0或负数。
JXN, JXZ, JXP, JXNN, JXNZ, JXNP (jump X negative, zero, positive, nonnegative,
nonzero, nonpositive). C=47; F=0, 1, 2, 3, 4, 5, respectively.
JiN, JiZ, JiP, JiNN, JiNZ, JiNP (jump i negative, zero, positive, nonnegative,
nonzero, nonpositive). C=40+i; F=0, 1, 2, 3, 4, 5, respectively.
和用于rA的对应操作类似。
Miscellaneous operators
SLA, SRA, SLAX, SRAX, SLC, SRC (shift left A, shift right A, shift left AX,
shift right AX, shift left AX circularly, shift right AX circularly). C=6;
F=0, 1, 2, 3, 4, 5, respectively.
这是6个移位命令。M用于指定向左或向右移动的MIX字节数,M必须为非负值。SLA和
SRA不会影响到rX;其它的移位则会影响到寄存器A和X,就跟它们是一个10字节寄存器
一样。对于SLA、SRA、SLAX和SRAX而言,0从寄存器的一端移入,而字节则从另一端消
失。SLC和SRC的意思是循环移位,从一端移出的字节将从另一端移入。rA和rX均会参与
循环移位。在任何情况下,这些移位命令都不会影响到寄存器A和X的符号。
MOVE. C=7; F=number, normally 1.
从M指定的位置向索引寄存器1指定的位置搬移F个字。每次搬移一个字,rI1最终的数值
将加上F。如果F=0,则不会发生任何事情。注意:源和目的内存区域重叠的问题。
NOP (no operation). C=0.
空操作。F和M将被忽略。
HLT (halt). C=5; F=2.
停止机器。当重启计算机时,其实际效果就相当于NOP。
Input-output operators
IN (input). C=36; F=unit.
这条指令会发起从指定的输入单元到以M开始的连续内存位置的信息传输。参与传输的
位置数目就是指定单元的块尺寸。如果之前对同一单元的操作尚未结束,机器将会在此
等待。信息传输操作结束的时间是不确定的,因此程序在操作结束之前不能引用内存中
的信息。
OUT (output). C=37; F=unit.
这条指令会发起从以M开始的内存位置到指定的输出单元的信息传输。如果设备尚未初
始化,机器将会等待。传输结束时间也是不确定的,因此程序在结束之间不能改变内存
中的信息。
IOC (input-output control). C=35; F=unit.
如果必要的话,机器将等待,直至指定单元不再busy。然后将执行一个控制操作,这取
决于所使用的特定设备。
JRED (jump ready). C=38; F=unit.
如果指定单元已变为ready(即之前由IN、OUT或IOC发起的操作已经结束)的话则发生
跳转。
JBUS (jump busy). C=34; F=unit.
和JRED类似,只不过是在指定单元不是ready的时候才发生跳转。
Conversion operators
NUM (convert to numeric). C=5; F=0.
这个操作用于把字符编码转换为数字编码。M将被忽略。寄存器A和X假定存放有一个10
字节的字符编码的数值,NUM指令将把rA的绝对值设置成这个数值的数字编码形式(按
一个10进制数的方式对待)。rX的值以及rA的符号都不会改变。
CHAR (convert to characters). C=5; F=1.
这个操作用于把数字编码转换为适合输出的字符编码。rA中的数值被转换为一个10字节
的十进制数,以字符编码方式写入寄存器A和X中。rA和rX的符号不变。M忽略。