在8085微处理器汇编语言中查找数字的绝对值

问题描述 投票:2回答:1

我的任务是用8085汇编语言查找任何给定数字的绝对值。

该算法如下(可在网上找到):

掩码= n >> 7(数字本身是8位)

((掩码+ n)XOR掩码

我的问题是我将如何用汇编语言实现这一点。似乎我应该使用“ RRC”命令,但是对数字执行循环移位,算法似乎不起作用。

任何想法都将不胜感激。干杯。

assembly bit-manipulation bit-shift 8085
1个回答
1
投票

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 >> 7abs在那里有用,通常只有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设置标志后分支将更便宜。

© www.soinside.com 2019 - 2024. All rights reserved.