将字符串的每个字符推入堆栈MIPS

时间:2015-03-05 21:05:10

标签: string assembly stack mips

所以我正在MIPS的一个项目上工作,检查用户输入的字符串是否是回文。我坚持的部分是读取字符串并逐个将字符串的每个字符推入堆栈(代码的PushLoop部分)。当我调试它时,该程序似乎认为我还没有输入任何东西。这就是我到目前为止所拥有的:

.text

main:

li $v0, 4                       # Prints str1
la $a0, str1
syscall

jal Init                        # Sets $s0 equal to $sp to compare if the stack is empty later

li $v0, 8                       # Read String
la $a0, buffer                  # Loads memory buffer (100)
li $a1, 100                     # Defines length of buffer
syscall

la $t0, buffer                  # Moves base register to $t0

PushLoop:   
    lb $a2, ($t0)               # Loads current character into $a2
    beqz $a2, fin               # if $a2 is equal to zero, the loop is terminated
    jal Push                    # Pushes what is stored in $a0 to the stack
    add $t0, $t0, -8            # Subtracts from buffer 
    j PushLoop

fin:
    la $t0, buffer              # Resets the memory buffer (I think)

PopLoop:
    jal IsEmpty                 # Checks if the stack is empty
    lb $a2, ($t0)               # Loads current character into $a2
    beq $v0, 1, isPal           # If stack is empty, jump to isPal
    jal Pop                     # Pops what is stored in the stack to $t1
    add $t0, $t0, -8            # Subtracts from buffer
    bne $a2, $t1, notPal
    j PopLoop


notPal:
    li $v0, 4                   # Prints str3
    la $a0, str3
    syscall

    li $v0, 0                   # loads 0 into $v0
    j end

isPal:
    li $v0, 4                   # Prints str2
    la $a0, str2
    syscall

    li $v0, 1                   # loads 1 into $v0
    j end

#EXIT
end: 
    li $v0, 10                  # ends the program
    syscall

Push:
    addi $sp, $sp, -8           # Move stack pointer
    sb $a2, ($sp)               # Store contents of $a2 at ($sp)
    jr $ra


Pop:
    lw $t1, ($sp)               # Pop char from stack and store in $t1
    addi $sp, $sp, 8            # Move stack pointer
    jr $ra

Init:
    add $s0, $sp, $zero         # Sets $s0 equal to $sp
    jr $ra


IsEmpty:
    beq $sp, $s0, Yes           # If $s0 is equal to the initial value of $sp, then stack is empty
    li $v0, 0                   # Loads 0 into $v0
    jr $ra

    Yes:
    li $v0, 1                   # Loads 1 into $v0
    jr $ra



 .data # Data declaration section
 str1: .asciiz "Please enter a String:  "
 str2: .asciiz "Is a palindrome!"
 str3: .asciiz "Is NOT a palindrome"

 buffer: .space 100

我确定代码中有更多错误,但我只是想一次压缩一个错误。非常感谢帮助我!

1 个答案:

答案 0 :(得分:1)

您没有正确使用系统调用8:

li $v0, 8                       # Read String
la $t0, buffer                  # Loads memory buffer (100)
syscall

如果您阅读the description of syscall 8,则会显示参数 $a0 = buffer, $a1 = length。因此,这三行代码应该改为:

li $v0, 8                       # Read String
la $a0, buffer
li $a1, 100                  
syscall

然后,如果您仍想使用la $t0, buffer作为$t0内存读取的基址寄存器,则可以在系统调用之后执行PushLoop