0

嘿伙计们,我正在为一个 comp 编写一个 mips 程序。拱。我正在上的课。教授要求我们:

提示输入 65 到 90 之间的四个整数,然后打印出与输入整数对应的 4 个 ASCII 字符的字符串。例如,如果用户输入“65 66 67 和 68”,程序将打印“ABCD”。假设我们只有 syscall #4 而没有 syscall #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
4

1 回答 1

1

你有两个问题。第一个给你例外的是你正在加载$a0要打印的字符,并且你正在使用需要在$a0(以空结尾的)字符串的地址中打印的服务 4。

所以要解决这个问题,你只需改变线条

 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

于 2014-10-14T15:39:58.070 回答