反转堆栈元素 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
这个程序有两个问题:
当你在 satack 上推送一些东西时,你必须将 $sp 减去 4 个字节,然后将操作数复制到那个
位置(按顺序)
我不知道你怎么会忘记这一点,因为你在弹出时正确地添加了 $sp ...无论如何
所以你需要添加subu $sp, $sp, 4
。 (或者 addiu $sp, $sp, -4
如果您的汇编程序没有为您将 sub 转换为 add。)
在循环中 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
我是 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
这个程序有两个问题:
当你在 satack 上推送一些东西时,你必须将 $sp 减去 4 个字节,然后将操作数复制到那个 位置(按顺序)
我不知道你怎么会忘记这一点,因为你在弹出时正确地添加了 $sp ...无论如何
所以你需要添加
subu $sp, $sp, 4
。 (或者addiu $sp, $sp, -4
如果您的汇编程序没有为您将 sub 转换为 add。)在循环中
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