我需要做的是使用LC-3 Assembly实现按位左移和按位右移。基本上,每个位都必须在移位方向上移动一个空格,零填充所创建的空白区域。
示例:
右移:
01001001
00100100→
左移:
01001001
←10010010
通过获取二进制字符串并将其添加到自身,我已成功实现了左移。
我很难理解如何进行正确的转变。任何想法将不胜感激。我有AND,NOT,ADD操作,数据移动操作,七个寄存器来存储值和整个存储器范围。我只需要一些基本的想法如何实现它。
如果您需要LC-3指令集参考,则有one here。
答案 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
的频率我确信还有办法解决领先的问题。