6

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

例子:

右移:

 01001001
 00100100→

左移:

 01001001
←10010010

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

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

如果您需要 LC-3 指令集参考,这里有一个

4

4 回答 4

6

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

如果您然后将您的一位寄存器移到一个位置并循环重复,您应该拥有您需要的东西。

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

编辑:

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

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

于 2012-04-09T18:54:39.677 回答
1

哇,这是一个非常小的指令集。

如果您有 256 字节的可用内存,那么查找表可能是要走的路。

您可以在没有数据存储器的情况下使用每个位位置上的循环来执行此操作,AND用于提取位。

于 2012-04-09T18:53:43.873 回答
0

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

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

我相信还有一种方法可以解决前导 1 的问题。

于 2015-02-10T20:22:53.517 回答
0

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

将 Mask1 与原始编号进行比较。If (Mask1 "and" input) > or < 0, "or" Mask2 with output 然后左移两个 Masks。

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

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

您测试 Mask1 “和”输入是否 > 或 < 0 的原因是因为如果它为零,我们什么也不想做。如果对这些操作数进行“与”运算的结果 > 0,则意味着测试的位置找到了“1”,需要将其打印到结果中。如果掩码左移变为 1000 0000 0000 0000,从技术上讲,这是一个负数。该位置的“和”以及该位置带有“1”的任何数字也将是负数。

于 2013-12-01T16:25:28.037 回答