Попытка отображения с помощью инструмента симулятора MMIO в задаче mars (mips на языке ассемблера) - PullRequest
0 голосов
/ 17 ноября 2018

провел поиск и не смог найти однозначного ответа на этот вопрос.Я пытаюсь отобразить строку текста на симуляторе MMIO на ассемблере (марс 4.5 ide).Поэтому в коде я прошу пользователя ввести строку, а затем я перехожу к функции, которая будет обращаться к соответствующему регистру для достижения этой цели.Вот мой код до сих пор

.data

# Do an inputted string text.
    input1: .asciiz "Please enter a string: "
# Make enough space for the array.
    array1: .space 101
# Resulting string.
    output1 :.asciiz "\nInputted string from MMIO: "

.text

# Display the first input and the resulting string.
    li $v0, 4
    la $a0, input1
    syscall
    li $v0, 8
    la $a0, array1
    la $a1, 101
    syscall
# Move the address of the first element in a temporary register.
    la $t0, ($a0)

# Now store some items on the stack.
    addiu $sp, $sp, -12
    sw $ra, ($sp)
    sw $t0, 4($sp)


# Then call the function to print that output back using a mock syscall
    jal print_line

# Restore whats on the stack.
    lw $ra, ($sp)
    lw $t0, 4($sp)
    addiu $sp, $sp, 12


# Terminate the program.
    li $v0, 10
    syscall

# Define the key_getter function.
print_line:

# Now load some stuff from the stack into this area.
    lw $a1, 4($sp)

# Then gather the hard coded memory address of the display terminal
    li $a2, 0xffff0000

# At this point, $a1 holds the memory address of the first element in the string.
# And $a2 holds the memory address of the display register for the MMIO.

loop:
#####
display_not_ready:

# Load the word from our display terminal with an offset of 8.
    lw $t0, 8($a2)
# Then isolate the bit at the very end.
    andi $t0, $t0, 1
# This means if the bit is 1, then the display is ready, if not branch
# until it is ready.
    beqz $t0, loop

# Check it the 12th offset is a new line if it is branch to done.
    lw $t1, 12($a2)
    beq $t1, 10, done

# If we've reached this far then there is a character ready to print.
    sw $t1, 12($a2)
# Move to the next character in the array.
    addi $a1, $a1, 1 
# Then branch back up to loop.
    b loop
# Have our done ready.
done:
jr $ra

Проблема : Всякий раз, когда я собираю код и ввожу строку, моя программа застревает в бесконечном цикле вокруг адреса памяти "display_not_ready" иbeqz $ t0, loop.

И он никогда не отображает строку для симулятора MMIO в поле дисплея.

Примечание : после прочтения нескольких ответов на этомвеб-сайт, да, я всегда проверяю, активирована ли кнопка «подключиться к mips».Это не проблема.

...