用mips反句的单词

时间:2013-12-13 21:29:49

标签: string assembly recursion mips

给你一个字符串,比如“你好,你叫什么名字?” 你必须使用递归函数来反转这些词 所以示例字符串的结果是“name?your is what hello”
该语言是MIPS汇编。

以下是我到目前为止所做的事情:(不幸的是,代码并未结束:|我找不到问题)

.macro print_int(%arg)
    li $v0, 1
    add $a0, %arg, $zero
    syscall
.end_macro

.macro print_string(%arg)
    move $t9, $a0
    li $v0, 4
    add $a0, %arg, $zero
    syscall
    move $a0, $t9
.end_macro

.text
    la $s0, string
    li $s1, 32 # space
    la $t8, space

    sub $s0, $s0, 1
    sb $s1, 0($s0)

    # find the length of the string
    move $t0, $s0 # $t0 = i = the iterator
L1:     lb $t1, 0($t0) # $t1 = i'th char of the string  
    beq $t1, 0, Exit # if string[i] == null, Exit
    addi $t0, $t0, 1 # i++
    j L1
Exit:
    sub $s3, $t0, $s0 # $s3 is the length of the string
    # Set arguements
    move $a0, $s0
    move $a1, $t0 # endFlag = length of the string


    jal reverse # call the function
    li $v0, 10
    syscall # exit

reverse:
    # save registers
    sub $sp, $sp, 12
    sw $ra, 0($sp)
    sw $a0, 4($sp)
    sw $a1, 8($sp)

    bgt $a1, $s0, L2 # base case
    add $sp, $sp, 12
    jr $ra

    # find a word in the string
L2:
    add $t0, $zero, $a1
    add $t3, $a0, $s3 # address of last character of the string

    Loop:
        lb $t4, 0($t3) # chracter from the string
        seq $v0, $s1, $t4 # if space
        ble $t3, $a0, Exit_Loop # if first of string
        beq $v0, 1, Exit_Loop # if character was space
        sub $t3, $t3, 1
        j Loop
    Exit_Loop:

    sb $zero, 0($t3)
    add $t3, $t3, 1
    print_string($t3)
    print_string($t8)

    #recursive call
    move $a1, $t3
    jal reverse

    # load registers
    lw $ra, 0($sp)
    lw $a0, 4($sp)
    lw $a1, 8($sp)
    add $sp, $sp, 12 # release the stack
    jr $ra

.data
    string: .asciiz "hello what is your name?"
    newline: .asciiz "\n"
    space: .asciiz " "

1 个答案:

答案 0 :(得分:1)

即使字符串为空(recursive),您的代码也不会停止输入函数$t3 == $a0 + 1
这是一个快速修复:替换您的代码:

Exit_Loop:

sb $zero, 0($t3)
add $t3, $t3, 1
print_string($t3)
print_string($t8)

#recursive call
move $a1, $t3
jal reverse

使用:

Exit_Loop:

sb $zero, 0($t3)
add $t4, $t3, 1
print_string($t4)
print_string($t8)

ble $t3, $a0, Exit_Func
#recursive call
move $a1, $t4
jal reverse

Exit_Func:

此外,请注意您的宏print_int不会存储/恢复$a0的值,即使在使用{{存储/恢复print_string的{​​{1}}中也是如此1}},这仍然很危险,因为根据$a0$t9期间MIPS32 ABI无法保证注册$t[0-9]中的值(保留时syscall