LC3装配按位右移

时间:2012-04-09 18:22:07

标签: assembly bitwise-operators bit-shift lc3

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

示例:

右移:

 01001001
 00100100→

左移:

 01001001
←10010010

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

我很难理解如何进行正确的转变。任何想法将不胜感激。我有AND,NOT,ADD操作,数据移动操作,七个寄存器来存储值和整个存储器范围。我只需要一些基本的想法如何实现它。

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

4 个答案:

答案 0 :(得分:5)

假设您设置R2以便它只设置一个位。然后,如果在AND条件下使用另一个寄存器和分支执行Z,则表示您正在测试该位是否已设置。如果是,则要在“结果”寄存器中设置前一位。

如果你将单位寄存器移到一个地方并重复循环,你应该得到你需要的东西。

(道歉,如果这是模糊的;因为这可能是家庭作业,我试图避免给你答案)

修改

因此,假设您的输入为01001011.您的输出为00000000,输入掩码为00000010,输出掩码为00000001.您执行AND并发现它非零,因此您将输出掩码添加到输出。然后将两个掩码移到00000100和00000010。

在下一次循环中,AND为零,因此您不添加任何内容,依此类推。当移动掩码使其为零时,循环终止。

答案 1 :(得分:1)

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

如果你有256字节的可用内存,那么可以选择查找表。

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

答案 2 :(得分:0)

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

将Mask1与原始数字进行比较。如果(Mask1“和”输入)>或者< 0,“或”Mask2带输出,然后左移两个掩码。

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

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

您正在测试Mask1“和”输入是否为>的原因或者< 0是因为如果它为零,我们什么都不做。如果“和”这些操作数的结果是> 0,那意味着测试的位置找到“1”并且需要打印到结果。如果掩模已左移至1000 0000 0000 0000,则技术上为负数。该位置的“和”以及该位置中具有“1”的任何数字也将是负数。

答案 3 :(得分:0)

假设前导0你可以通过一次又一次减去除以2。

计算ADD RX,RX,#-2

的频率

我确信还有办法解决领先的问题。