从输入的int中打印相应的ascii值

时间:2014-10-14 15:13:04

标签: assembly ascii mips data-conversion mars-simulator

嘿伙计们我正在为一个comp写一个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

1 个答案:

答案 0 :(得分:1)

你有两个问题。 第一个给你异常的是你正在加载int $a0要打印的字符,你正在使用服务4,它需要$a0的地址(null-已打印的字符串。

所以要解决这个问题,你只需更改行

即可
 lb $a0, ($s5)

 move $a0, $s5

或同等(例如add $a0, %s5, $zero)。

但是你还需要字符串以null结尾。因此,您应该在每个字母后添加一个零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值的两倍。