LC3程序按位右移
我需要做的是使用LC-3汇编实现按位左移和按位右移。 基本上,每一个位都必须在移位方向上移动一个空间,并且零填充所创建的空白空间。
例子:
右移:
01001001
00100100→
左移:
01001001
←10010010
我已经成功实现了一个左移,通过获取二进制字符串,并将其添加到自身。
我很难理解如何进行正确的转变。 任何想法将不胜感激。 我有AND,NOT,ADD操作,数据移动操作,七个寄存器来存储值和整个内存范围。 我只需要一些基本的想法如何实施。
如果您需要LC-3指令集参考,这里有一个。
假设你设置了R2
,使它只有一个位集。 然后,如果您在Z
条件下对另一个寄存器和分支执行AND
,则您正在测试是否设置了该位。 如果是这样,您想要在“结果”寄存器中设置前一位。
如果你然后把你的单一位寄存器移到一个地方并在一个循环中重复,你应该有你所需要的。
(道歉,如果这是模糊的;因为这大概是家庭作业,我试图避免只是给你答案)
编辑:
因此,假设您的输入为01001011.您的输出为00000000,输入掩码为00000010,输出掩码为00000001.您执行AND操作并发现它不为零,因此您将输出掩码添加到输出中。 然后你将两个掩码转移到00000100和00000010。
在下一次循环中,AND为零,所以你什么都不加,等等。 当移动掩码使其归零时,循环终止。
哇,这是相当简单的指令集。
如果你有256个字节的内存可用,那么查找表可能是一条可行的路。
你可以在没有数据存储器的情况下使用循环遍历每个位的位置,使用AND
来提取该位。
你需要两个面具。 它们都是单个“1”,其余都是“0”。 两者都被初始化为0000 0000 0000 0001,但其中一个左移的数量要使原始数字右移。 我们将调用Mask1。 未转移的号码将是Mask2。
将Mask1与原始号码进行比较。 如果(Mask1“和”input“)或<0,”或“Mask2带输出,然后左移两个掩码。
在任何一种情况下,左移两个掩码并再次尝试,直到输入中没有更多位用于测试。
LC-3没有按位“或”。 你将不得不“操作”两个操作数,“和”他们,然后“不”,结果是按位“或”。
你测试Mask1“和”input是>还是<0的原因是因为如果它是零,我们不想做任何事情。 如果“和”这些操作数的结果大于0,那意味着测试的位置找到了“1”,并且需要将结果打印出来。 如果掩码已经左移到1000 0000 0000 0000,这在技术上是一个负数。 该位置的“和”以及该位置中具有“1”的任何数字也将是负数。
链接地址: http://www.djcxy.com/p/72673.html上一篇: LC3 Assembly Bitwise Right Shift
下一篇: C question: Padding bits in unsigned integers and bitwise operations (C89)