可以通过补充数字并加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--
这个序列还产生了什么令人反感的结果?如何轻松避免?
很抱歉,如果不清楚的话。请随时向我询问有关此问题的任何其他信息。
答案 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不太可能有用,也具有破坏性。有点双输。