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

发布于 2024-08-22 09:49:38 字数 208 浏览 5 评论 0原文

我尝试执行以下操作:

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

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

I tried to do the following:

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

however it generates an error... am I doing something wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

忆悲凉 2024-08-29 09:49:38

也许您的汇编器不喜欢 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 注释不匹配

andi Rdest, Rsrc1, Imm
将逻辑
寄存器中的整数的 AND
Rsrc1 并 Imm 到寄存器 Rdest 中。

Perhaps your assembler doesn't like 0x1 integers?

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

Or if your assembler doesn't like ABI names for registers, use register numbers?

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

If you use MARS or SPIM Simulator, or clang or other normal MIPS assemblers,
andi $s7, $s6, 0x1 assembles just fine.


Note andi doesn't add anything, so the i+j comment doesn't match

andi Rdest, Rsrc1, Imm
Put the logical
AND of the integers from register
Rsrc1 And Imm into register Rdest.

面如桃花 2024-08-29 09:49:38

bneq 不存在。

使用

bne $s7,$zero,else

帖子编辑:

这是一个工作示例

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

请添加任何错误消息!

bneq does not exist.

Use

bne $s7,$zero,else

Post edit:

Heres a working example

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

Please add any error msg!

吹梦到西洲 2024-08-29 09:49:38

根据你的问题标题,我认为这个答案对其他人和对我一样有用:

因为,对于二进制值,如果它以 0 结尾,它是偶数,如果它以 1 结尾,它是奇数。因此,您基本上需要使用如下所示的移位逻辑指令来获取数字的第一位。

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

Following your question title, I thought this answer could be as useful to someone else as it was for me:

Since, for a binary value, if it ends with 0, it's even, if it ends with 1, it's odd. So, you basically need to get the first bit of a number with shift logical instructions like bellow.

sll $t0, $s0, 0x1F      
srl $s1, $t0, 0x1F 
  • s0 contains the value to be validated
  • t0 intermediates the shift operations
  • s1 has the final result (0 for even, 1 for odd)
  • Since each register has a value of 32 bits and we need just the first one, we shift the others 31 (0x1F) bits
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文