2009-04-18 5 views
4

Напишите программу MIPS, которая генерирует и добавляет все четные числа от 1 до 100.Правильно ли моя программа MIPS?

  • он должен иметь по крайней мере один петлевой
  • он должен хранить сумму в регистре R12

И вот что я написал:
main: 
    li  $t0, 0    # clear register $t0 to zero 
    li  $t4, 0    # clear register $t4 to zero 
loop: 
    add  $t0, $t0, 2   # generating even numbers in register $t0 
    add  $t4, $t4, $t0  # compute the sume 
    bne  $t0, 100, loop  # if t0 reached 100 then go to loop. 
    b endloop     # branch to endloop 
endloop: 
    li  $v0, 10    # terminate program run and 
    syscall      # Exit 

Это правильно?

+0

Можете ли вы запустить его? У вас есть доска MIPS или эмулятор или что-то еще? –

+0

Я использую gxemul для эмуляции архитектуры mips под управлением NETBSD http://en.wikipedia.org/wiki/GXemul – Tom

+0

Другой эмулятор - qemu, который эмулирует кучу архитектур и систем, включая MIPS. – sigjuice

ответ

0

Попробуйте this эмулятор. Когда я взял Computer Organization, я использовал SPIM, и он был довольно прост в использовании. Вы также можете найти учебники по MIPS в Интернете. Помните, что Google - ваш друг.

+0

, пожалуйста, не могли бы вы помочь мне запустить и посмотреть, правильно ли я понял. Спасибо – 2009-04-18 01:57:36

+0

, но предположим, что нужно добавить четные числа из От 1 до 100? – 2009-04-18 02:39:22

0

Вы должны быть в состоянии использовать SPIM самостоятельно. Кроме того, строка «b endloop» не нужна, потому что если вы не ответите назад на вершину цикла, программа «упадет в» endloop.

Скачать SPIM здесь:
http://pages.cs.wisc.edu/~larus/spim.html

9

Я только что закончила свой MIPS класса сборки и у меня есть предложение для вас: Не используйте PC спит!

Я использовал PC Spim, Mars и Qemu, а лучшим для общей курсовой работы является Mars (Mips Assembler and Runtime Simulator). Редактор хорош, он сбрасывает много меньше, и он позволяет легко отлаживать и устанавливать точки останова. Он бесплатный, с открытым исходным кодом и создан Государственным университетом штата Миссури.

Он поставляется в формате .jar, поэтому вы можете запускать его как на Windows, так и на Linux. alt text
[Mars Mips Emulator]

В общем случае, простой способ сказать, является ли число четным или нечетным является И (побитовое) 1 с числом и, если результат равен 0, то число четное.

Однако, поскольку мы хотим, чтобы все четные числа в серии, мы можем просто зацикливать и увеличить наш номер на 2, как в вашем опубликованном коде.

При добавлении немедленного значения вы должны использовать инструкции «addi» или «addu», а не «добавить». Вы также сказали, что хотите поместить результат в регистр $ r12, но это не действительный регистр MIP. Ознакомьтесь с ссылкой на MIPs wikipedia, чтобы просмотреть список всех регистров: MIPS - Register Usage.

Я модифицировал вашу программу для правильной работы. Он сохраняет окончательный результат в $ t1, а затем печатает окончательный результат.

   .text 
       .globl main 
main: 
    li  $t0, 0    # $t0 = loop counter 
    li  $t1, 0    # $t1 = sum of even numbers 
loop: 
    addi $t0, $t0, 2   # generating even numbers in register $t0 
    add  $t1, $t1, $t0  # compute the sum 
    bne  $t0, 100, loop  # if t0 reached 100 then go to loop. 

    li  $v0, 4 
    la  $a0, result 
    syscall      # print out "Sum = " 

    li  $v0, 1 
    move $a0, $t1 
    syscall      # print out actual sum 


exit: 
    li  $v0, 10    # terminate program run and 
    syscall      # Exit 


       .data 
result:   .asciiz "Sum = " 

После запуска этого в Марс я получаю следующее:

Sum = 2550
- программа завершения работы -

+0

, но предполагается ли добавить цифры от 1 до 100? – 2009-04-18 02:37:04

+0

@ kenny9999999, Да, это так. – mmcdole

+0

Черт ... очень много работало. – 2009-04-18 04:08:37

0

код выглядит нормально. Как сказал cunwold, «b endloop» является ненужным, так как цель ветки - это первая ветвь (bne ...). Однако есть одна ошибка.

Вы используете ту же инструкцию (добавить) двумя способами. Инструкция

add $t0,$t0,2 

должен быть

addiu $t0,$t0,2 

Поскольку вы добавляете inmediate, а не два регистра.

Итак, вот оно. Я заменил часть syscall фактическим возвратом функции (значение возвращается в регистре $ v0).

Надеюсь, это поможет.

main.c Файл

#include <stdio.h> 

extern int addEven(); 

int main(){ 


     printf("%d\n",addEven()); 
     return 0; 
} 

addEven.S файлов (монтаж)

#include <mips/regdef.h> 

    /* 
    * int addEven(); 
    * Adds even numbers between 0 and 100. 
    * 0 + 2 + 4 + 6 +....+100 = 2550 
    */ 

     .text 
     .align 2 
     .globl addEven 

addEven: 
     li  t0,0   # clear register $t0 to zero 
     li  t4,0   # clear register $t4 to zero 
loop: 
     addiu t0, t0,2   # generating even numbers in register $t0 
     add  t4, t4,t0   # compute the sume (R12 = t4) 
     bne  t0, 100, loop  # if t0 reached 100 then go to loop. 
endloop: 
     move v0,t4 
     jr  ra 

Я скомпилировал и связал эти файлы. Вот оно.

[email protected]:~/stackoverflow# gcc -c -g addEven.S 
[email protected]:~/stackoverflow# gcc -c -g main.c 
[email protected]:~/stackoverflow# gcc main.o addEven.o -o prog 
[email protected]:~/stackoverflow# ./prog 
2550 
[email protected]:~/stackoverflow# 
+0

Вы часто используете MIP? Если да, для чего вы его используете? Мне любопытно, потому что мне нравятся MIP, но не вижу, как я буду использовать его очень часто. – mmcdole

+0

Я использую его довольно часто, но только для образовательных целей. Я пытаюсь заставить некоторые доски сделать это на один шаг дальше. – Tom

Смежные вопросы