assembly 检查寄存器值在MIPS中是否为偶数/奇数

vdzxcuhz  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(124)

我试着做了以下几点:

# with $s6 holding i+j
andi $s7, $s6, 0x1      # (i + j) & 1 (to check if it's even)
if: bneq $s7, $zero, else

但是它生成了一个错误...我做错了什么吗?

j7dteeu8

j7dteeu81#

也许您的汇编程序不喜欢0x1整数?

andi $s7, $s6, 1
bnez $s7, odd         # branch if not-equal to Zero.

或者,如果您的汇编程序不喜欢寄存器的ABI名称,请使用寄存器编号?

andi $23, $22, 1      # $22=$s6  and   $23=$s7

如果使用MARS或SPIM Simulator、clang或其他普通MIPS汇编程序,
andi $s7, $s6, 0x1组装得很好。
注意andi没有添加任何内容,因此i+j注解不匹配

和接收方,Rsrc1,立即

将寄存器Rsrc1与Imm中的整数的逻辑与值放入寄存器Rdest。

5uzkadbs

5uzkadbs2#

bneq不存在。
用途

bne $s7,$zero,else

后期编辑:
下面是一个工作示例

#include<mips/regdef>
    ...
    andi    t1,t1,0x1

请添加任何错误消息!

pgpifvop

pgpifvop3#

根据您的问题标题,我认为这个答案对其他人和我一样有用:
因为,对于一个二进制值,如果它以0结尾,那么它是偶数,如果它以1结尾,那么它是奇数,所以,你基本上需要用移位逻辑指令来得到一个数的第一位,就像下面这样。

sll $t0, $s0, 0x1F      
srl $s1, $t0, 0x1F
  • s0包含要验证的值
  • t0作为移位操作的中间
  • s1具有最终结果(0表示偶数,1表示奇数)
  • 由于每个寄存器的值为32位,我们只需要第一个寄存器,因此我们将其他31(0x1F)位移位

相关问题