我知道即使我向右移动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
答案 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
上分享此编程教程的链接答案 1 :(得分:1)
你正在做一些奇怪的事情,还有一个容易修复的错误。但是,除非你修复了奇怪的东西,否则你将会变得很孤独。
首先,就像@markgz所说,这些系统调用应该做什么?摆脱所有这些,除了你从用户那里获得价值的那个。否则,您将一遍又一遍地从用户那里获得一个号码。
其次,分支到msg
毫无意义。 msg
处的内存是一个ASCIIZ字符串,其中包含字符m
,s
,g
和\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
我会留给你弄清楚我在做什么。关于你的方法的一件事:如果设置了最高有效位,它就会失败(如果它是一个负的有符号整数,它就会失败。)