反转堆栈元素 MIPS 逻辑错误

Reversing stack elements MIPS logical error

我是 MIPS 的新手,正在编写一个堆栈程序来反转数组中的元素。我已经尝试了一切以查看是否有任何问题。如果有人可以指导我吗?

.data
array: .word 4, 1, 2, 3, 2, 23, 33, 3, 1, 9
.word 21, 23, 25, 27, 29, 31, 3, 5, 7, 5
.word 41, 43, 45, 47, 49, 51, 53, 55, 57, 59
length: .word 30

.text
.globl main
.ent main
main:

la $t0, array
li $t1, 0 
lw $t2, length 
pushLoop:
lw $t4, ($t0) 
sw $t4, ($sp)
add $t2, $t1, 0 
add $t0, $t0, 4 
blt $t1, $t2, pushLoop 


la $t0, array 
li $t1, 0 
lw $t2, length 
popLoop:
lw $t4, ($sp)
addu $sp, $sp, 4 
sw $t4, ($t0) 
add $t1, $t1, 1 
add $t0, $t0, 4 
blt $t1, $t2, popLoop 



li $v0, 10 
syscall 
.end main

这个程序有两个问题:

  1. 当你在 satack 上推送一些东西时,你必须将 $sp 减去 4 个字节,然后将操作数复制到那个 位置(按顺序)

    我不知道你怎么会忘记这一点,因为你在弹出时正确地添加了 $sp ...无论如何

    所以你需要添加subu $sp, $sp, 4。 (或者 addiu $sp, $sp, -4 如果您的汇编程序没有为您将 sub 转换为 add。)

  2. 在循环中 add $t2,$t1,0 是错误的..你应该做 $t1,$t1,1(因为你似乎递增了一个像 i = i + 1)..这个错误是间接的 导致你的循环不正确地比较 t1 和 t2 寄存器(并且你错误地更新了 t2 寄存器)

    加0只是一个副本,所以这也不是你想要的。

这是更正后的代码。

.data
array: .word 4, 1, 2, 3, 2, 23, 33, 3, 1, 9
.word 21, 23, 25, 27, 29, 31, 3, 5, 7, 5
.word 41, 43, 45, 47, 49, 51, 53, 55, 57, 59
length: .word 30

.text
.globl main


.ent main
main:

la $t0, array
li $t1, 0 
lw $t2, length 
pushLoop:
lw $t4, ($t0) 
subu $sp, $sp, 4 
sw $t4, ($sp)
add $t1, $t1, 1 
add $t0, $t0, 4 
blt $t1, $t2, pushLoop 


la $t0, array 
li $t1, 0 
lw $t2, length 
popLoop:
lw $t4, ($sp)
addu $sp, $sp, 4 
sw $t4, ($t0) 
add $t1, $t1, 1 
add $t0, $t0, 4 
blt $t1, $t2, popLoop 



li $v0, 10 
syscall 
.end main