使用Shift运算符和bne检查mips上的偶数或奇数

时间:2014-01-08 05:07:17

标签: mips

我知道即使我向右移动1,然后向左移动1并且数字保持为原始数字,我也可以检查是否为整数。

我的代码无法按预期工作。这是我第一次使用MIPS,任何帮助将不胜感激。我想让用户输入任何数字,我的代码会告诉用户它是否是偶数。

.data
msg: .asciiz "even"
.text
.globl main

main:
li $v0, 5
syscall 
or $t0, $0, $v0 # Register $t0 gets input 

srl $t1 , $t0 , 1 #shift right by 1
syscall
sll $t1 , $t0 , 1 #shift left by 1
syscall


bne $t1, $t0, msg # if t1 equals t2 then it prints out even
syscall    

2 个答案:

答案 0 :(得分:1)

您的代码中存在很多错误。

srl $t1 , $t0 , 1 #shift right by 1

syscall  # why you are using syscall here ??

sll $t1 , $t0 , 1 #shift left by 1--and should be sll $t1, $t1, 1 

syscall #and why also here ??

bne $t1, $t0, msg #wrong ,here you need to pass label as third operand for offset

li      $v0,4       # code 4 == print string
la      $a0,string  # $a0 == address of the string

syscall 

注意:尽管如此,你可以做到&对任何具有0x1的数据进行操作,然后检查结果是0(偶数)还是1(奇数)

我还希望在mips

上分享此编程教程的链接

http://chortle.ccsu.edu/AssemblyTutorial/index.html

答案 1 :(得分:1)

你正在做一些奇怪的事情,还有一个容易修复的错误。但是,除非你修复了奇怪的东西,否则你将会变得很孤独。

首先,就像@markgz所说,这些系统调用应该做什么?摆脱所有这些,除了你从用户那里获得价值的那个。否则,您将一遍又一遍地从用户那里获得一个号码。

其次,分支到msg毫无意义。 msg处的内存是一个ASCIIZ字符串,其中包含字符msg\0。这些不是你要找的32位。你需要分支到一个指令。我将假设标签isEven和isOdd存在于某处。

这个错误就是@Konrad所说的。省略了奇怪的系统调用,你的代码正在这样做:

srl $t1, $t0, 1 # shift *original val* right by 1 *and put in $t1*
sll $t1, $t0, 1 # shift *original val* left by 1 *and put in $t1*
bne $t1, $t0, isOdd # *will always be true because we just changed $t1 to be <> $t0*

因此,如果您遵循@ Konrad的建议,它将如下所示:

srl $t1, $t0, 1 # shift *original val* right by 1
sll $t1, $t1, 1 # shift *modified val* left by 1
bne $t1, $t0, isOdd # *Now we know if the value changed*

请注意,我正在分支到isOdd。您声称如果值不同,则数字是偶数。这是不正确的。

顺便说一下,我最喜欢这样做的方式会有所不同:

andi $t1, $t0, 0x01
beq $t1, $zero, isEven

我会留给你弄清楚我在做什么。关于你的方法的一件事:如果设置了最高有效位,它就会失败(如果它是一个负的有符号整数,它就会失败。)