당신이하고있는 이상한 몇 가지가 있습니다 , 하나 쉬운 수정 버그에서의 프로그래밍 튜토리얼에 대한 링크. 그러나 당신이 이상한 것들을 고쳐 줄 때까지, 당신은 떠들썩하게 될 것입니다.
먼저 @markgz가 말했듯이, 그 syscall은 무엇을하고 있을까요? 귀하가 사용자로부터 가치를 얻는 것을 제외하고는 모두 제거하십시오. 그렇지 않으면 사용자의 번호를 계속해서 가져올 것입니다.
두 번째로, msg
으로 분기하는 것은 의미가 없습니다. msg
의 메모리는 m
, s
, g
및 \0
을 포함하는 ASCIIZ 문자열입니다. 이들은 당신이 찾고있는 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*
당신이 콘라드의 제안 @ 따르는 경우에 따라서는 다음과 같을 것이다 : 나는 ISODD로 분기하고있어
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*
참고. 값이 다른 경우 숫자가 짝수라고 주장했습니다. 그건 잘못된거야. 여담으로
는이 작업을 수행하는 내가 제일 좋아하는 방법은 조금 다른 것 :
이
andi $t1, $t0, 0x01
beq $t1, $zero, isEven
내가 뭘하는지 알아 내기 위해 당신에게 그것을 떠날거야. 귀하의 방법에 대한 한 가지 : 가장 중요한 비트가 설정되면 실패합니다 (음의 부호있는 정수).
왜'srl'과'sll' 명령 다음에'syscall'을 가지고 있습니까? – markgz
'sll $ t1 $ t1 1'이어야합니다. –