MIPS Сборка домашних заданий.Не могу найти ошибку - PullRequest
3 голосов
/ 19 марта 2012

Хорошо, вопрос в следующем: Используя MARS, разработайте программу, которая:

  • Предлагает пользователю ввести целое число,
  • Считывает целое число с клавиатуры (скажем, n),
  • Вычисляет и распечатывает сумму нечетных чисел и сумму четных чисел от 1 по номеру

Вот моя попытка, пожалуйста НЕ РЕШИТЕ ​​МОЮ РАБОТУ. Я хотел бы учиться на своих ошибках. Мой вопрос: где я ошибся, регистры, кажется, идут в -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

1 Ответ

2 голосов
/ 19 марта 2012

В вашем коде есть несколько ошибок, но после применения этих изменений все должно быть в порядке.

  1. Вы инициализируете $s5 после ветвления, что оставляет $s5 неинициализированнымкогда у вас есть четное начальное число.

  2. Когда начальное число нечетное и ваша программа его обрабатывает, поток управления безоговорочно падает до четного случая.Вам нужно перейти к выходной части вашей программы после того, как odd_n завершит свои вычисления.

  3. Вам нужно загрузить 4 в $v0 до того, как вы сделаете syscall дляпокажите msgeven (и пока вы это делаете, подумайте об исправлении размещения символа новой строки в обоих сообщениях).

...