我的任务是用8085汇编语言查找任何给定数字的绝对值。
该算法如下(可在网上找到):
掩码= n >> 7(数字本身是8位)
((掩码+ n)XOR掩码
我的问题是我将如何用汇编语言实现这一点。似乎我应该使用“ RRC”命令,但是对数字执行循环移位,算法似乎不起作用。
任何想法都将不胜感激。干杯。
该n>>7
算法中的abs
是算术右移,因此,对于负数n为-1
,对于非负数为0
。 (在2的补码中,-1
的位模式已设置所有位)。
然后,您可以使用它不执行任何操作(n+0) ^ 0
或“手动”执行-n = (n + (-1)) ^ -1 = ~(n-1)
的2的补码求反。
请参见How to prove that the C statement -x, ~x+1, and ~(x-1) yield the same results?了解2的补码身份。与全1的异或不是按位的。添加mask = -1
当然是n-1
[我不认为8085可以轻松地实现此无分支绝对值/,我没有看到一种根据累加器符号将寄存器设置为0
或-1
的有效方法。
只需简单的方法即可实现:[if(n<0) n=-n;
这与条件分支在否定条件上无关紧要; 8085确实具有取决于符号位的分支。因此,根据A
设置标志,然后根据否定设置JP
。 (“加”条件测试Sign标志= 0,因此它实际上是在测试非负数而不是严格的正数)
我在neg
中没有看到https://www.daenotes.com/electronics/digital-electronics/instruction-set-intel-8085指令,因此您可以将另一个寄存器和sub
置零,或者可以用xri -1
(NOT)等2的补码来对累加器求反。 inr a
(累加器+ = 1)。
CMA
是否按位不是A = ~A
?从我搜索过的内容还不清楚。但这是“逻辑的”,因此我认为它不是2的补码取反。
8085具有(我认为)便宜的分支,不像现代的流水线CPU,在分支中,分支可能会很昂贵并且需要正确的预测。无分支mask = n >> 7
的abs
在那里有用,通常只有3或4条指令。
可能如果您确实想根据8085上的符号位无分支地产生0或-1,则可以执行类似的操作
RLC ; low bit of accumulator = previous sign bit ANI 1 ; isolate it XRI 1 ; flip it: 0 for negative, 1 for non-negative DCR A ; 0 or 1 -> -1 or 0
这显然很烂,并且需要额外的
mov
来保存以前的累加器值。用
ANA A
设置标志后分支将更便宜。