【问题标题】:Swapping 3rd and 5th bit with each other in Mips在 Mips 中相互交换第 3 位和第 5 位
【发布时间】:2022-01-17 04:24:57
【问题描述】:

我的初始计划正在执行,但我需要帮助才能继续前进:

.data
str: .asciiz "Please enter an Integer: "
.text
main:
li $v0,4
la $a0,str1
syscall

li $v0,4
la $a0,str2
syscall

li $v0,4
la $a0,str
syscall

li $v0,5
syscall
move $t0,$v0

sll $t1,$t0,3
sll $t2,$t0,5

bnez $t1,label1
move $t1,1

我想交换用户输入的整数的第 3 位和第 5 位。

【问题讨论】:

  • 旋转 (sll/srl/OR) 然后 bit-blend with a mask 将是一种方式。但是由于 MIPS 本身没有旋转,所以在移动之前(和之后?)屏蔽可能更好,这样你就可以 AND/OR 到原来的?嗯,也许不是。
  • 好吧,如果只有一个示例代码可以解释我如何指向整数的各个位的一些逻辑,那么它将非常有帮助
  • 这种位操作在某种程度上与语言无关,因此无需为此“在汇编中思考”。首先使用 &、|、> 等在纸上或 C 中尝试。 if-then 是如果你必须(虽然它们不是必需的),然后把它带到汇编语言中。

标签: assembly binary bit-manipulation mips mars-simulator


【解决方案1】:

如果在开始时(8 位)你有:abcdefgh,并且你想交换第 5 位和第 3 位位置的值,那么输出如下所示:abedcfgh

可能有十几种方法可以做到这一点。

(我已经使用位位置 5 和位位置 3 使用正常位位置编号编写了这个,其中低位(最低位/最低有效位/LSB)被视为位位置编号 0 - 如果你真的想要交换第 5 位和第 3 位,这将是第 4 位和第 2 位。如果您想要从左侧/MSB 开始的第 5 位和第 3 位,那也将有所不同。)

到目前为止,您有 $t1 = abcdefgh000 和 $t2= abcdefgh00000。这可能不会太有用。

但是,如果您改为向右移动,您将拥有000abcde00000abc,这越来越接近于隔离两个感兴趣的位。使用常数为 1 的 & 运算符,您将得到 0000000e0000000c,这是两个 1 位字段的基本提取。

不过,您实际上并不需要像我们通常在位字段提取中那样对这些位进行右对齐,因为它们可以使用右移和左移直接移动到新的所需位位置。

您想要的一个中间值是原件的副本,在感兴趣的位置有孔(零),而其他是在位 3 位置的 c 的值,否则被零包围,值 e 在第 5 位的位置类似地被零包围。

  76543210
  abcdefgh    original value
  11010111    mask, constant value 215 decimal
  ======== &  bitwise "and" operation
  ab0d0fgh    intermediate value #1

  76543210
  abcdefgh    original value
         2    shift count=2, decimal
  ======== >> binary right shift operation
  00abcdef    intermediate value #2

  76543210
  00abcdef    intermediate value #2
  00001000    mask, 8 (decimal)
  ======== &  bitwise and operation
  0000c000    intermediate value #3, "c" in the bit 3 position

  76543210
  ab0d0fgh    intermediate value #1
  0000c000    intermediate value #3
  ======== |  bitwise or operation
  ab0dcfgh    intermediate value #4
  
  76543210
  abcdefgh    original value
         2    shift count=2, decimal
  ======== << binary left shift operation
  cdefgh00    intermediate value #5

  76543210
  cdefgh00    intermediate value #5
  00100000    mask, 32 (decimal)
  ======== &  bitwise and operation
  00e00000    intermediate value #6, "e" in the bit 5 position

  76543210
  ab0dcfgh    intermediate value #4
  00e00000    intermediate value #6
  ======== |  bitwise or operation
  abedcfgh    desired output

对于| 的(按位或)运算,加法也可以在这里工作,因为我们知道一个操作数有 0,而另一个有 0 或 1,因此不会发生进位,所以 + 的结果(加法)将与 | 相同(按位或运算)。

我已经用 8 位显示了这个,你必须调整为完整的 32 位。

【讨论】:

  • 查询者需要第 3 位,即位 #2 而不是位 #3。在您的示例中,您使用的是第 4 位,即低半字节的顶部,也就是第 3 位。显然这很好,因为这只是一个示例,但如果他们认为您的位 3 是他们想要的位,则可能会误导 OP。
  • @PeterCordes,哎呀,不错。希望他们能大致了解。第 5 位与第 5 位也是如此。
  • 您可能应该在示例之前或之后添加一个关于位编号的段落,以确保在您的答案中提到它。也许甚至在最顶端。也许只是说“你说的是第 3 位,第 2 位,但是这个答案中的示例显示的是第 3 位,第 4 位。原理当然是一样的。”
猜你喜欢
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2019-12-26
  • 2023-02-24
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多