2014-10-14 2 views
0

Привет, ребята, я пишу программу mips для комп. архипелаг класс, который я принимаю. Профессор спросил нас:Печать соответствующего значения ascii из введенных ints

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

Я добавил код ниже, всякий раз, когда я запускаю его, я получаю исключение Runtime в 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 

ответ

1

У вас есть две проблемы. Первый, который дает вам исключение, заключается в том, что вы загружаете символ, который вы хотите распечатать, и используете службу 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.

+0

Спасибо, что это сработало отлично. :) – Horrerblade

Смежные вопросы