Ошибка вывода 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
взят.