【问题标题】:LC3 Assembly Bitwise Right ShiftLC3 程序集按位右移
【发布时间】:2012-04-22 02:19:38
【问题描述】:

我需要使用LC-3 Assembly 实现按位左移和按位右移。基本上,每一位都必须在移位方向上移动一个空间,并且一个零填充创建的空白空间。

例子:

右移:

 01001001
 00100100→

左移:

 01001001
←10010010

我已经成功实现了左移,方法是获取二进制字符串并将其添加到自身。

我不知道如何执行右移。任何想法将不胜感激。我有 AND、NOT、ADD 操作、数据移动操作、七个寄存器来存储值和整个内存范围。我只需要一些如何实现它的基本想法。

如果您需要 LC-3 指令集参考,请参阅 one here

【问题讨论】:

标签: assembly bitwise-operators bit-shift lc3


【解决方案1】:

哇,那是相当少的指令集。

如果您有 256 字节的可用内存,那么查找表可能是不错的选择。

您可以在没有数据存储器的情况下使用循环遍历每个位位置,使用AND 来提取位。

【讨论】:

【解决方案2】:

假设您设置R2,使其只有一个位集。然后,如果您使用另一个寄存器执行AND 并在Z 条件上进行分支,则您正在测试该位是否已设置。如果是,您想在“结果”寄存器中设置前一位。

如果您随后将您的单位寄存器移到一个位置并循环重复,您应该得到您需要的。

(抱歉,如果这含糊不清;因为这大概是家庭作业,我试图避免只给你答案)

编辑:

所以,假设您的输入是 01001011。您从输出 00000000、输入掩码 00000010 和输出掩码 00000001 开始。您执行 AND 并发现它不是零,因此您将输出掩码添加到输出。然后将两个掩码移过来,得到 00000100 和 00000010。

在下一次循环中,AND 为零,所以你什么也不加,等等。当移动掩码使其为零时,循环终止。

【讨论】:

  • 这可能行得通,但在我看来,必须有一个更简单的方法来实现它(比如在左移中添加它自己)你是正确的,这是家庭作业,它应该在这个星期三(4 月 11 日),所以我有几天的时间来寻找更好的解决方案,然后再用这种方法“蛮力”它。
  • 这不完全是“蛮力”;包括设置在内只有 9 行代码。
【解决方案3】:

你需要两个面具。它们都是一个“1”,其余都是“0”。两者都初始化为 0000 0000 0000 0001,但其中一个左移了您希望原始数字右移的量。我们称它为 Mask1。未移位的数字将是 Mask2。

将 Mask1 与原始编号进行比较。 If (Mask1 "and" input) > or

在任何一种情况下,左移两个掩码并重试,直到输入中没有更多位要测试。

LC-3 没有按位“或”。您将必须“不”两个操作数,“和”它们,然后“不”按位“或”的结果。

您测试 Mask1 “和”输入是否为 > 或 0,则表示测试的位置找到了“1”,需要将其打印到结果中。如果掩码已左移变为 1000 0000 0000 0000,从技术上讲,这是一个负数。该位置的“和”以及任何在该位置带有“1”的数字也将是负数。

【讨论】:

  • 如果你知道没有进位,你可以add 代替or。之所以如此,是因为您一次只工作一点。
【解决方案4】:

假设前导 0,您可以通过一次又一次地减去 2 来除。

算一算你可以添加 RX、RX、#-2 的频率

我相信还有一种方法可以绕过前导 1。

【讨论】:

  • 一种绕过提醒 1 的方法是,在除法之前使用 0xFE 和寄存器。但这个解决方案对我来说看起来很慢
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
相关资源
最近更新 更多