Справка по отладке MIPS

Кажется, мое понимание MIPS меня подводит.

Что мне нужно сделать, так это создать программу, которая переворачивает ввод строки с терминала, используя стек, но без использования $sp. Есть здесь кто-нибудь, кто знает MIPS?

Зарегистрировать использование

t0 – начало адреса строки
t1 – начало адреса стека
t2 – временная температура извлеченного символа
t3 – счетчик для t0
t4 – счетчик для стека
t5 – новая строка< br/> t6 - Длина

.data

theString:  .space 42
newLine:    .asciiz "\n"
stack:      .space 42

.globl main

.text

главный:

li      $v0, 8      #  Set to read string
la  $a0, theString
li      $a1, 42     #  Set size of string
syscall         #  Read string from terminal

la      $t0, theString  #  Prepare t0 with theString
la      $t1, stack  #  Prepare t1 with stack
la  $t5, newLine

addi    $t3, $t0, 0
addi    $t4, $t1, 42

j push

толкать:

addi    $t3, $t3, 1
addi    $t4, $t4, -1

lb  $t2, ($t3)
beq $t2, $t5, epush
sb  $t2, ($t4)

j push

эпуш:

sub $t6, $t3, $t0
addi    $t6, $t6, -1

addi    $t3, $t0, 0
addi    $t4, $t1, 0

j pop

поп:

addi    $t3, $t3, 1
addi    $t4, $t4, 1 

lb  $t2, ($t4)
beq $t2, $t5, epop
sb  $t2, ($t3)

j pop

Эпос:

addi    $t3, $t3, 1
sb  $t5, ($t3)


li  $v0, 4      #  Set to print string
la  $a0, theString  #  Set var to syscall output register
syscall         #  Print string

li  $v0, 10     #  Set to end program
syscall         #  End Program

Например, это просто дает бесконечный цикл. (Извините за отсутствие комментариев, я просто рву на себе волосы)

Теперь я думаю, что проблема где-то связана с символом новой строки, но я не знаю, где?


person Jack Pearson    schedule 28.10.2010    source источник


Ответы (1)


Есть ли причина, по которой вы используете j, а не jal? И, похоже, вы используете SPIM, который имеет множество проблем.

В вашем цикле pop вы сравниваете (в beq) адрес новой строки (в $t5) и адрес следующего символа в строке. Даже если они могут содержать адрес местоположения, содержащего "\n", адреса могут не совпадать, поскольку "\n" может находиться более чем в одном месте. На самом деле, я могу гарантировать, что они никогда не будут одинаковыми, потому что один будет ссылаться на адрес захваченной строки, а тот, что в $t5, будет адресом того, что в начале программы.

person xxpor    schedule 28.10.2010
comment
Ах, так как мне сравнить фактическое значение новой строки со значением в $t5? - person Jack Pearson; 28.10.2010
comment
Я не знаю, сработает ли это, но попробуйте lb из $t5 и $t2 в 2 других временных регистра и сравните их. - person xxpor; 28.10.2010
comment
Спасибо. Теперь он отлично выходит из цикла, но просто печатает исходную строку? - person Jack Pearson; 28.10.2010
comment
Попробуйте использовать "\0" вместо "\n". SPIM может завершать строку на новой строке, а не добавлять ее в конец строки. - person xxpor; 28.10.2010
comment
Хм. Тогда у меня нет идей, извините. Когда в прошлом семестре я изучал компьютерную организацию и дизайн, я никогда не манипулировал строками. - person xxpor; 28.10.2010