Ошибка вывода MIPS

У меня есть неизвестная ошибка вывода после ввода 2-го значения, которое после ввода базового номера.

Надеюсь, некоторые из вас могли бы определить мою ошибку:

ОШИБКА: инструкция ссылается на неопределенный символ в 0x00400060 [0x00400060] 0x102a0000 beq $1, $10, 0 [hex-0x0040005c]

ПРОГРЕСС: В настоящее время застрял на шаге 2.

Что я хочу сделать, это

1) Пользователь вводит десятичное значение

2) Пользователь вводит тип конверсии

3) Перейти к желаемой подпрограмме в зависимости от типа конверсии, выбранного ранее

4) Вывод на дисплей

.data 
prompt: .asciiz "Enter the decimal number to convert: "
base: .asciiz "Select type of base (2 for binary,16 for hexadecimal or 8 for octal): " 
ans1: .asciiz "\nBinary Output is equivalent:"
ans2: .asciiz "\nOctal Output is equivalent:"
ans3: .asciiz "\nHexadecimal Output equivalent:0x" 
result1: .space 8 
.text 
.globl main 
main: 

la $a0, prompt #Display message
li $v0, 4 
syscall
li $v0, 5 
syscall
beq $v0, $zero, Exit #Exit if 0 decimal is entered 
move $t0, $v0   #Else copy value entered into temporaries

askbase:

li $v0, 4
la $a0, base #Display message
syscall
li $v0, 5
syscall
add $t1,$zero,$v0   #Add desired value/base entered into t1

beq $t2,16,hex #if base 16 is entered,goto hex subroutine
beq $t2,8,oct
beq $t2,2,bin

la $a0, ans3 
li $v0, 4 
syscall 
li $t0, 8   # counter 
la $t3, result1 # where answer will be stored 

Hex: 

beqz $t0, Exit  # branch to exit if counter is equal to zero 
rol $t2, $t2, 4 # rotate 4 bits to the left 
and $t4, $t2, 0xf   # mask with 1111 
ble $t4, 9, Sum # if less than or equal to nine, branch to sum 
addi $t4, $t4, 55   # if greater than nine, add 55 

b End 

Sum: 
addi $t4, $t4, 48   # add 48 to result 

End: 
sb $t4, 0($t3)  # store hex digit into result 
addi $t3, $t3, 1    # increment address counter 
addi $t0, $t0, -1   # decrement loop counter 
j Loop 

Exit: la $a0, result1 
li $v0, 4 
syscall 
la $v0, 10 
syscall

2 ответа

Похоже, у вас есть опечатка в строке 29 beq $t2,16,hex должно быть beq $t2,16,Hex, Обратите внимание на заглавную букву Hex, У вас также есть несколько неопределенных меток: Loop, oct, bin... Без этих меток у вас будут проблемы. Хорошей идеей будет просто установить некоторые из них в качестве заполнителей (пока вы не определили их подпрограммы). Может быть, они все ответвляются Exit:, Ассемблер не может разрешить ваши инструкции ветвления, не имея реальных меток для перехода.

Вы ничего не сохранили в $t7поэтому нет особой причины ожидать, что $t7 будет равно 16.

Что вы, вероятно, хотели написать:

beq $t1,16,hex

поскольку $t1 регистр, в котором вы сохранили базу

Тем не менее, я действительно не понимаю, почему вы хотели бы, чтобы такой переход соответствовал тому, как структурирован код в настоящее время. hex подпрограмма опирается на несколько регистров (например, $t0 а также $t3) для инициализации определенных значений, и эта инициализация будет пропущена, если это beq взят.

Другие вопросы по тегам