2012-03-19 1 views
3

확인을 찾을 수 없습니다 질문은 다음과 같다 : 말 (MIPS 어셈블리 숙제. 버그

  • 정수를 입력하라는 메시지를 표시,
  • 키보드에서 정수를 읽습니다 : MARS를 사용하는 프로그램을 개발 n),
  • 홀수와 짝수의 합을 계산하여 1 에서 n으로 출력합니다. 여기

이 숙제를 해결하지 마십시오, 내 시도이다. 나는 내 실수에서 배우고 싶다. 내 질문 ---------------, 레지스터는 실행에게 그것을 -MAXINT로 이동하는 것 그리고 당신은 :(

# Assignment 3, part 1 
    # NAME 
    #The Formulas used in this assignments are visible in a text document 
    #attached in the zip. and their mathematical proofs. 
     # Odd or Even Checker by parity bit in binary format. 
     # by anding it with the number N 
     # if it is odd, the anding will result in 00000001 
     # if it is even the ANDing will result in all 0 
     # we can check if the result is ==0 or not 
     # then use mathematical formulas to derive the sums 
     # using the least number of instructions  
     # Without using the not-yet-learnt instructions. 

를 볼 것이다, 내가 잘못 않은 곳이다 -------------------------------------------------- --------

.data  #Data Declaration Section 
    msg1: .asciiz "Hello, Enter an Integer:\n->" 
    msgodd: .asciiz "Odd Sum is :\n" 
    msgeven: .asciiz "Even Sum is :\n" 
.text  
     #START 

    la $a0, msg1 #Load the address of label msg1 
    li $v0,4 #Load int 4 to v0, and address the system call. 
    syscall 

    #Request a Syscall for integer input 
    li $v0,5 #Load int 5 <int inp> 
    syscall 

    move $a0,$v0 #copy the int entered 
    parity: 
    move $t0,$a0 #will be used to test for odd or even 
    move $a3,$a0 #will be used later 
    andi $t0,00000001 # this is the parity bit i talked about above. 
    beq $t0,$zero,even_n 
    #s1 hold odd sum, s2 hold even sum, t1 is temp for odd, t2 is temp for even 
    li $s5,1 
    odd_n: 
move $t1,$a3 
move $t2,$a3 
addi $t2,$t2,-1 

ol: 
    add $s1,$s1,$t1 
    addi $t1,$t1,-2 
    bne $t1,$s5,ol 

el: 
    add $s2,$s2,$t2 
    addi $t2,$t2,-2 
    bne $t2,$zero,el 

    even_n: 
move $t1,$a3 
move $t2,$a3 
addi $t1,$t1,-1 

eol: 
    add $s1,$s1,$t1 
    addi $t1,$t1,-2 
    bne $t1,$s5,eol 

eel: 
    add $s2,$s2,$t2 
    addi $t2,$t2,-2 
    bne $t2,$zero,eel 

    print: 
    li $v0,4 
    la $a0,msgodd 
    syscall 
    li $v0,1 
    move $a0,$s1 
    syscall 

    la $a0,msgeven 
    syscall 
    li $v0,1 
    move $a0,$s2 
    syscall 

    exit: 
    li $v0,10 
    syscall 
+0

귀하가 계산할 때 s1과 s2의 값을 인쇄하는 것이 좋습니다. –

+1

또는 각 명령을 단계별로 실행하여 오류가 어디에서 발생하는지 확인하는 화성의 내장 기능을 사용하는 것이 더 좋습니다. – Wiz

답변

2

이 코드 문제 몇 가지가 있지만 이러한 변경 사항을 적용한 후 괜찮을한다.

  1. 당신은를 초기화분기 후, 시작 번호가 짝수 일 때 $s5이 초기화되지 않습니다.

  2. 시작 번호가 홀수이고 프로그램이 처리를 완료하면 무조건 제어 흐름이 짝수 경우로 넘어갑니다. odd_n이 계산을 완료 한 후 프로그램의 출력 부분으로 점프해야합니다.

  3. 당신은 당신이 msgeven를 표시 할 수 syscall하기 전에 $v04를로드해야합니다 (그리고 당신이 그것에있는 동안, 두 메시지의 개행 문자의 위치를 ​​고정 생각).

+1

s1과 s2가 초기화되었는지 확실하지 않습니다. 이미 다른 모든 단계를 제공 했으므로 (거의 그를 위해 해결하지 말라는 그의 요청에 반하여),이 코드도 추가 할 수 있습니다. –

+1

실수를 수정하는 데 필요한 코드를 제공하지 않았습니다. . OP는 그의 해결책이 잘못 된 곳을 알고 싶었고 나는 그에게 말했다. 또한 MARS는 이러한 레지스터를 0으로 초기화하므로이 경우 '$ s5'초기화 만 중요합니다. –

+1

예, 당신 말이 맞아요 - 그는 자신의 실수를 찾는 법을 배우고 싶다는 말을하지 않았습니다. 단지 그들로부터 배울 수 있기를 바랍니다 ... –