这个序列还产生了什么令人反感的结果?如何轻松避免?

时间:2017-06-02 05:24:07

标签: opcode machine-code lc3

可以通过补充数字并加1来获得数字的2的补码。因此,假设值A和B在R0和R1中,三个指令的哪个序列执行" A减去B"并将结果写入R2?

这是一个例子,本书使用概述LC-3 ISA。

第一行只是为二进制编号以便更好地解释。 NOT(操作码= 1001),ADD(操作码= 0001)。操作码位于[15:12]。位[11:9]指定目标寄存器。位[8:6]指定源寄存器。位[5]指定指令是使用立即寻址模式(如果位[5] = 1)还是寄存器寻址模式(如果位[5] = 0)当使用NOT时,位[5:0]必须包含全1(操作码) = 1001)。因此,以下三个位代码表示文本中给出的答案

"计算系统介绍:从位和门到c及以后"

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
 |  |  |  |  |  | | | | | | | | | | |

 1  0  0  1  0  0 1 0 0 1 1 1 1 1 1 1
 --NOT-----  --R1-- --R1- -----------

 0  0  0  1  0  0 1 0 0 1 1 1 1 1 1 1
 --ADD-----  --R2-- --R1- - ----1----

 0  0  0  1  0  1 0 0 0 0 0 0 0 0 1 0
 --ADD-----  --R2-- --R0- ----- -R2--

这个序列还产生了什么令人反感的结果?如何轻松避免?

很抱歉,如果不清楚的话。请随时向我询问有关此问题的任何其他信息。

1 个答案:

答案 0 :(得分:0)

R1留有垃圾值。

如果我们做了

NOT R2, R1
ADD R2, R2, -1
ADD R2, R0, R2

然后R1仍然有R1,R0仍然有R0,R2有结果。因此,如果有其他操作使用初始值,我们不必从内存重新加载值。如果我们做了

NOT R1, R1
ADD R1, R1, -1
ADD R2, R0, R1

然后R1具有-R1,R0具有R0且R2具有结果。如果我们需要通过值重复递减数字(例如,减去将字符转换为数字等的偏移量),那么我们只需要做一次否定。如果我们做了

NOT R1, R1
ADD R1, R1, -1
ADD R0, R0, R1

然后我们自己保存一个寄存器,R0可以作为运行值,在R1不断递减的情况下,有效地将其用作累加器。

但是,存储输入寄存器的按位NOT不太可能有用,也具有破坏性。有点双输。