2014-01-08 1 views
0

오른쪽으로 1 시프트 한 다음 정수가 있는지 확인한 다음 왼쪽으로 1 시프트하고 숫자를 원래 숫자로 유지하는지 확인할 수 있습니다.Shift 연산자와 bne을 사용하여 밉에서 짝수 또는 홀수 확인하기

내 코드가 의도 한대로 작동하지 않습니다. 이것은 처음 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  
+1

왜'srl'과'sll' 명령 다음에'syscall'을 가지고 있습니까? – markgz

+0

'sll $ t1 $ t1 1'이어야합니다. –

답변

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

당신이하고있는 이상한 몇 가지가 있습니다 , 하나 쉬운 수정 버그에서의 프로그래밍 튜토리얼에 대한 링크. 그러나 당신이 이상한 것들을 고쳐 줄 때까지, 당신은 떠들썩하게 될 것입니다.

먼저 @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 

내가 뭘하는지 알아 내기 위해 당신에게 그것을 떠날거야. 귀하의 방법에 대한 한 가지 : 가장 중요한 비트가 설정되면 실패합니다 (음의 부호있는 정수).