MIPS中的反向字符串

时间:2016-02-28 18:57:28

标签: string assembly mips

我正在尝试编写一个程序来获取用户字符串输入并在MIPS中反转该字符串。 但是,我必须做一些可怕的错误,因为它不仅反向显示用户输入,而且还会向用户反转提示。似乎用户输入最终没有用null(零?)字符标识。

.data
prompt: .asciiz "Please enter your name. You're only permitted 20 characters. \n"
userInput: .space 20 #user is permitted to enter 20 characters

.globl main
.text
main:
    # user prompt
    li $v0, 4
    la $a0, prompt
    syscall

    # getting the name of the user
    li $v0, 8
    la $a0, userInput
    li $a1, 20
    syscall 

    add $t0, $a0, $0            # loading t0 with address of array
    strLength: 
        lbu   $t2, 0($t0)
        beq   $t2, $zero, Exit  # if reach the end of array, Exit
        addiu $t0, $t0,   1     # add 1 to count the length
        j strLength
    Exit:

    add $t1, $t0, $0      # t1 = string length
    li  $t2, 0            # counter i = 0

    li $v0, 11
    reverseString:
        slt  $t3, $t2, $t1    # if i < stringlength
        beq  $t3, $0,  Exit2  # if t3 reaches he end of the array
        addi $t0, $t0, -1     # decrement the array 
        lbu  $a0, 0($t0)      # load the array from the end
        syscall
        j reverseString
    Exit2:

    li $v0, 10
    syscall

1 个答案:

答案 0 :(得分:1)

问题1:

add $t1, $t0, $0      #t1 = string length

您在$t1分配的内容不是字符串的长度;它是地址超过字符串结尾的第一个字节。

问题2是你永远不会在$t2循环中增加$t1(或递减reverseString)。

我建议你使用SPIM / MARS中的调试功能(比如设置断点和单步执行代码的能力),因为这样就可以很容易地找到这些问题。