逻辑右移,无需专用移位指令

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

我正在使用不包含乘法、除法或位移位指令的汇编语言。我知道只需将相同的数字添加到自身即可实现左移 -

add A, A
- 但我不确定右移。我如何使用
add
sub
not
and
or
等指令实现右位移位?

还有

adc
sbb
如果有帮助的话。这是我正在设计的自制计算机的指令集,我想看看我已经实现的指令集是否可行。

完整指令集为

add
sub
adc
sbb
nand
or
cmp
mv
ld
st
lda
, 
lpm
push
pop
jnz
halt

assembly math bit-manipulation bitwise-operators bit-shift
1个回答
7
投票
有几种方法可以在有限的机器上完成右移 - 尽管我认为大多数方法都需要比较和分支操作,因为它们涉及循环和条件操作。


右移就像除以 2。因此,一种方法是除以 2,您的机器没有直接的除法,但可以通过重复减法来模拟。  编写一个循环来减 2(加 -2)并计算可以执行多少次;该计数将是原始值除以 2(留下余数)。


否则,我们可以一次复制一个位到新位置。

  • 从零值开始作为结果值,如果之后需要,则复制原始值,否则下面将修改原始值。

  • 初始化循环计数器。

  • 循环:

    • 测试原值是否设置了高位,如果是则结果值加1。  测试高位,检查是否为负。

    • 递增/递减并测试循环计数器,如果迭代 15 次则退出循环。  (此处假设 16 位机器/字大小)。

    • 否则,将原始值加倍,并将结果值加倍,然后重复。

这将完成逻辑右移。  如果需要算术右移,请复制原始符号位。

从左侧一次复制一点(最重要的),如果进行 16 次迭代,您将获得原始版本的精确副本,但在 15 次迭代时停止,您将获得 1 位右移原始的,并且原始的被减少到余数(尽管现在处于 MSB 位置)。


或者,从两个值开始,每个值仅设置一位:

  • 第一个,称之为输入位置是00000000000000102,并且

  • 第二个,称之为输出位置为00000000000000012

  • 结果值初始化为0。

  • 然后循环 15 次,执行以下操作:

      “and”原始值与输入位置
    • 如果该值非零,则将输出位置“或”到结果值中
    • 输入位置加倍(左移)
    • 输出位置加倍(左移)
© www.soinside.com 2019 - 2024. All rights reserved.