Программа MIP для обращения строки с использованием стека - PullRequest
1 голос
/ 27 февраля 2012

Я получаю ошибки при запуске моей программы.Вот ошибки, которые я получаю.

Я получаю сообщение об ошибке исключения.Ошибка «Неверный адрес в считывании данных / стека»

Ошибка: «Инструкция ссылается на неопределенный символ»

В консоли указано «Строка, подлежащая обращению:

COSC 300 Exception 7 [неверный адрес данных] произошел и игнорируется

Программа

.data

str: .asciiz "String to be reversed : \n" 
msg: .asciiz "COSC 300" 
ans: .asciiz "The string reversed is : " 

.text
.globl main



main: 

la $a0, str            #print string
li $v0, 4 
syscall

la $a0, msg            #print string
li $v0, 4
syscall

la $t0, msg            #load a string to be reversed



loop:
lb $t0, 0 ($t0)       #load char from msg
beqz $t0, stringEnd   # if null end loop
addi $sp, $sp -1      # reduce stack pointer
sb $t0, 0 ($sp)       # store t0 into stack
addi $t1, $t1, 1      # gets next char
j loop


stringEnd:
la $t1, msg1


storeLoop:
lb $t0, 0($t0)
beqz $t0, end
lb $t4, 0($sp)
sb $t4, 0 ($t0)
addi $t1, $t1, 1
addi $sp, $sp, 1
j storeLoop


end:
la $a0, ans
li $v0, 4 
syscall

move $a0, $t4
li $v0, 4
syscall

li $v0, 10 
syscall

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Одна вещь, которая выглядит немного забавно:

В обоих циклах и storeLoop вы используете $ t0 в качестве указателя, а также в качестве символа для загрузки.Это означает, что при первой загрузке байта вы повредите указатель.

1 голос
/ 05 марта 2013

Псевдокод:

print(intro)
text = readString()

// find the end of the string
for (addr = text; *addr != NUL; addr++) { }

// now print it backward
while (--addr >= text) {
 printChar(*addr)
}

Регистры:

addr => $t0, tmp => $t1, orig => $t2

    li      $v0, 4          # print(intro)
    la      $a0, intro
    syscall

    li      $v0, 8          # text = readString()
    la      $a0, text
    li      $a1, 256        # (size of input buffer)
    syscall

    la      $t0, text       # addr = text
    move    $t2, $t0        # orig = addr (backup of original address)
find:   lb      $t1, 0($t0)     # tmp = *addr
    beq     $t1, 0, print   # while(tmp != NUL)
    addi    $t0, $t0, 1     # addr++
    j       find            # (end loop)

print:  subi    $t0, $t0, 1     # --addr
    blt     $t0, $t2, end   # while (addr >= orig)
    li      $v0, 11         # printChar(
    lb      $a0, 0($t0)     #   *addr
    syscall                 # )
    j       print           # (end loop)

end:    li      $v0, 10         # exit cleanly
    syscall
...