【问题标题】:LC3 Assembly - How do I toggle the lowest order bit in a binary number?LC3 组装 - 如何切换二进制数中的最低位?
【发布时间】:2017-11-21 04:30:03
【问题描述】:

我想知道是否有办法在二进制中切换低位。
例如:
01000001 -> 切换低位 -> 01000000
仅更改右侧的最后一位。
如果您对 LC3 不熟悉,它只有以下操作:

  • 添加

  • 不是

【问题讨论】:

  • 你能不能只和结果,BITS,xFFFE?
  • and 将清除位,而不是切换
  • 布尔代数告诉我们:a XOR b := (a AND (NOT b)) OR ((NOT a) AND b)(其中一位为 1,另一位为 0)
  • 这似乎是一个非常烦人的编程架构。您必须花费大量时间弄清楚如何进行基本的布尔运算,例如 XOROR,以及弄清楚要测试和分支的位。

标签: assembly lc3


【解决方案1】:

这通常通过 XOR 操作来完成。

; field is R0
; R1 is mask of bits to toggle
; R2 is scratch
LD R0, #0b01000001
LD R1, #0b00000001
NOT R2, R0
AND R2, R2, R1
NOT R1, R1
AND R0, R0, R1
ADD R0, R0, R2
; result in R0

【讨论】:

  • 您的代码有效,但不是a bitwise NOR。整体操作是an XOR,所以它会翻转掩码中设置的每一位。
  • @PeterCordes,真的!我不知道为什么我说 NOR。我在考虑 XOR,甚至在查看 XOR 真值表。
【解决方案2】:

如果最低位为0,则需要加1。

如果最低位为1,则需要加-1。

所以如果输入是a,那么:

 x = a and 1    ; x = 0/1 depending on lowest bit
 x = x + x      ; x = 0/2
 x = not x      ; x = -1/-3
 x = x + 2      ; x = +1/-1
 r = a + x      ; will toggle lowest bit of original a

我假设在 LC3 中使用二进制补码负整数值,因此 NOT 2 == -3-1 + 2 = +1

不幸的是,我不了解 LC3,所以我只希望我的步骤相当简单,可以通过 LC3 指令实现,并且算法有意义。


其他选项是使用NOT 切换位(不是添加):

 x = a and (not(1)) ; (0xFFFE in case of 16b word)
     ; x = copy of all bits of A except bottom bit (bottom bit = 0)
 y = not(a) and 1   ; extract toggled bottom bit (1/0)
 r = x + y          ; compose the value back from the upper:lowest bit(s)

编辑:这是米奇在他的回答中所做的。

【讨论】:

  • AFAIK,LC3 的 add 指令是无符号二进制(因此也是 2 的补码符号)。任何其他有符号数字格式都需要单独的有符号加法指令。或者换句话说,如果设置了最低位,则需要添加以清除最低位的数字是无符号全一,就像您使用 C unsigned 一样。
  • 使用更多的常量可能对 LC3 不利;我不认为它有任何直接的形式。但是您可以更轻松地将 (~0-1) 写成 ~1。这就是@Mitch 的实现:使用掩码和ADD(作为OR 的替代)双向ANDN 以在not(a)a 之间进行位混合。 (就像您在 PBLENDVB 不可用时将元素与 SSE2 AND/ANDN/OR 混合一样。)
  • @PeterCordes 是的,Mitch 的实现很到位,没有什么可添加的。我仍然相信我的回答可能会为 OP 添加更多背景知识,它是如何工作的,以及“添加”方式的想法...... (~0-1) 很愚蠢,我什至不知道 OP 是否理解 C 语法...... . 就 LC3 问题而言,not(1) 可能是最好的,将对其进行编辑。
  • 是的,赞成解释它为什么起作用。在阅读您的文章之前,我并没有真正了解 Mitch 的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 2014-02-22
  • 2013-03-13
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多