Печать соответствующего значения ascii из введенных ints

Привет, ребята, я пишу программу mips для компа. арка. класс, который я беру. Профессор попросил нас:

запросить четыре целых числа от 65 до 90 включительно, затем распечатать строку из 4 символов ASCII, соответствующую входным целым числам. Например, если пользователь вводит «65 66 67 и 68», программа напечатает «ABCD». Предполагая, что у нас есть только системный вызов №4 и нет системного вызова №11.

Я добавил свой код ниже, всякий раз, когда я запускаю его, я получаю исключение времени выполнения по адресу 0x004000e8: адрес вне диапазона 0x00000041 как ошибка. Любая помощь в том, что я делаю неправильно, была бы замечательной, спасибо.

.data           #data Segment

stringMsg: .asciiz "Enter 4 integers that are between 65-90, inclusive: "
                #Stores string in data segment + null terminator

alphaTable: .byte 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'

    .text

string: 

    li $v0, 4           #Syscall #4 prints string
    la $a0, stringMsg   #Loads address of string "inputMsg"
    syscall             #Prints inputMsg    

    li $v0, 5           #Syscall #5 reads integer
    syscall             #reads inputted val into $v0
    la $s0, ($v0)       #save first number into s0

    li $v0, 5           #Syscall #5 reads integer
    syscall             #reads inputted val into $v0
    la $s1, ($v0)       #save second number into s1

    li $v0, 5           #Syscall #5 reads integer
    syscall             #reads inputted val into $v0
    la $s2, ($v0)       #save third number into s2

    li $v0, 5           #Syscall #5 reads integer
    syscall             #reads inputted val into $v0
    la $s3, ($v0)       #save fourth number into s3

    sub $s0, $s0, 65    #Subtract 65 from the 4 # to get correlating value in array
    sub $s1, $s1, 65
    sub $s2, $s2, 65
    sub $s3, $s3, 65

    la $s4, alphaTable  #Loads table into $s4   (used to get index val)
    la $s5, alphaTable  #Loads table into $s5   (used to reset index val)


    add $s5, $s5, $s0
    li $v0, 4           #Syscall #4 prints string
    lb $a0, ($s5)       #Loads address of string "inputMsg"
    syscall             #Prints inputMsg
    la $s5, ($s4)

    add $s5, $s5, $s1
    li $v0, 4           #Syscall #4 prints string
    lb $a0, ($s5)       #Loads address of string "inputMsg"
    syscall             #Prints inputMsg
    la $s5, ($s4)

    add $s5, $s5, $s2
    li $v0, 4           #Syscall #4 prints string
    lb $a0, ($s5)       #Loads address of string "inputMsg"
    syscall             #Prints inputMsg
    la $s5, ($s4)

    add $s5, $s5, $s3
    li $v0, 4           #Syscall #4 prints string
    lb $a0, ($s5)       #Loads address of string "inputMsg"
    syscall             #Prints inputMsg


exit:
    li $v0, 10          #syscall #10: exit
    syscall             #ends program

person Horrerblade    schedule 14.10.2014    source источник


Ответы (1)


У вас две проблемы. Первый, который дает вам исключение, заключается в том, что вы загружаете int $a0 символ для печати, и вы используете службу 4, которой требуется $a0 адрес строки (с завершающим нулем) для печати.

Чтобы исправить это, вам нужно просто изменить строки

 lb $a0, ($s5)

с участием

 move $a0, $s5

или эквивалент (например, add $a0, %s5, $zero).

Но вам также нужно, чтобы строка оканчивалась нулем. Таким образом, вы должны добавлять нулевой код ascii после каждой буквы и учитывать этот дополнительный байт при установке смещения.

Таким образом, alphaTable должно быть примерно таким:

alphaTable: .byte 'A', 0, 'B', 0, 'C', 0, 'D', 0, 'E', 0, 'F', 0, 'G', 0, 'H', 0, 'I', 0, 'J', 0, 'K', 0, 'L', 0, 'M', 0, 'N', 0, 'O', 0, 'P', 0, 'Q', 0, 'R', 0, 'S', 0, 'T', 0, 'U', 0, 'V', 0, 'W', 0, 'X', 0, 'Y', 0, 'Z', 0

и чтобы учесть дополнительный байт в каждом смещении, вы должны добавить удвоенное смещение символа для печати. Поэтому вместо move $a0, $s5, упомянутого выше, вы можете просто ввести

add $a0, $s5, $s0

так что $a0 будет содержать базовый адрес alphaTable ($s5) плюс удвоенное значение $s0.

person gusbro    schedule 14.10.2014