добавление всех цифр до 10 в MIPS - PullRequest
0 голосов
/ 28 февраля 2012

Я подумал, что у меня есть идея, как это сделать, используя только add, sub, mult, addi и, или, andi, ori, lw, sw, beq, bne, slt, slti, mflo.

Я должен убедиться, что каждая деталь там, указатель стека ясен и т. Д.

любая помощь в решении этой проблемы, пожалуйста? не для домашней работы, просто для учебы для теста. Я попытался решить это и понял это неправильно, и просто хочу найти правильное решение, чтобы я мог видеть, что я сделал неправильно. я бы попросил своего профессора, но сегодня у него нет рабочих часов, и мне нужно выяснить это сегодня вечером, так как я занят всю оставшуюся неделю

1 Ответ

1 голос
/ 29 февраля 2012

Нет реальной причины что-либо делать с указателем стека, если мы не хотим что-то хранить в стеке.Однако в такой простой программе проще работать исключительно с регистрами.(используя только add, sub, mult, addi и, или, andi, ori, lw, sw, beq, bne, slt, slti, mflo.)

    .text
    .global main
main:
    addi    $t0, $zero, 10          # (counter) we will start with 10 and go down to zero
    add     $t1, $zero, $zero       # (sum) our sum, 0
count:
    add     $t1, $t1, $t0           # sum += counter
    addi    $t0, $t0, -1            # counter -= 1
    bne     $t0, $zero, count       # if (counter) goto count
    add     $v0, $zero, $t1         # return value, our sum
    #jr     $ra                     # return (jr not allowed?)

Если вы действительно хотите использоватьстек для хранения локальных переменных (count и sum), вы можете сделать что-то вроде этого.Однако, как видите, он довольно обширный и ненужный.

    .text
    .global main
main:
    addi    $sp, $sp, -12       # Make room on the stack ($ra, sum, counter)
    sw      $ra, 0($sp)         # save the return address (not really needed)
    sw      $zero, 4($sp)       # sum variable, set to 0
    addi    $t0, $zero, 10
    sw      $t0, 8($sp)         # counter variable, set to 10
count:
    lw      $t0, 4($sp)         # load sum
    lw      $t1, 8($sp)         # load counter
    add     $t0, $t0, $t1       # sum += counter
    addi    $t1, $t1, -1        # counter -= 1
    sw      $t0, 4($sp)         # save the sum value
    sw      $t1, 8($sp)         # save the counter
    bne     $t1, $zero, count   # if (counter) goto count

    lw      $v0, 4($sp)         # return value, the sum
    lw      $ra, 0($sp)         # restore caller's address
    addi    $sp, $sp, 12        # pop the stack
    #jr     $ra                 # return to caller (jr not allowed?)
...