从MIPS中的内存加载值不正确
贪婪, 我正在火星上进行一个MIPS项目。可悲的是,它看起来像,我不正确理解MIP的工作原理。 例如:我的寄存器$ a0带有数组的baseaddress,在寄存器$ a1中是数组的长度。 数组中的每个元素都是半字。如果以前的数字为零,我想将一个元素移动一个文章。例如2 0 2 0 4 => 2 2 0 4 0 问题是,我的程序甚至都不会从数组中加载正确的元素。
.text
.global move_one
move_one:
addiu $sp $sp -12
sw $a0 8($sp)
sw $a1 4($sp)
sw $a2 0($sp)
li $v0 0
b loop
loop:
addiu $a1 $a1 -1
beqz $a1 end
lhu $a2 0($a0)
addiu $a0 $a0 2
beqz $a2 shift
b loop
shift:
lhu $a2 0($a0)
sh $a2 -2($a0)
sh $zero 0($a0)
li $v0 1
b loop
end:
lw $a0 8($sp)
lw $a1 4($ap)
lw $a2 0($ap)
addiu $sp $sp 12
jr $ra
在我发现的测试中,这种转变从未被调用,并且$ a2在运行时也有不同的值,也是0。
我希望我能使我的问题清楚。
我真的很感谢任何帮助。
编辑:
.data
.globl main
message:
.asciiz "move_one returned: "
board:
.half 0,0,2,0
.half 0,0,0,0
.half 0,0,0,0
.half 0,0,0,0
buf:
.word 0,0,0,0
.text
main:
la $t0 board
la $t1 buf
sw $t0 0($t1)
addiu $t0 $t0 2
sw $t0 4($t1)
addiu $t0 $t0 2
sw $t0 8($t1)
addiu $t0 $t0 2
sw $t0 12($t1)
la $a0 buf
la $a1 4
jal move_one
move $t0 $v0
la $a0 message
li $v0 4
syscall
move $a0 $t0
li $v0 1
syscall
li $v0 11
li $a0 10
syscall
li $a1 16
la $a0 board
jal print_board_test
li $v0 10
syscall
Greedings,
I am working on an MIPS project in Mars. Sadly it looks like, I don't understand correctly how MIPS works.
For example: I have the Register $a0 with the baseaddress of an array and in register $a1 is the length of the array.
Every element in the array is a halfword. I want to shift a element one postion if the number before is a zero. E.g. 2 0 2 0 4 => 2 2 0 4 0
The problem is, that my program doesn't even load the right Elements from the array.
.text
.global move_one
move_one:
addiu $sp $sp -12
sw $a0 8($sp)
sw $a1 4($sp)
sw $a2 0($sp)
li $v0 0
b loop
loop:
addiu $a1 $a1 -1
beqz $a1 end
lhu $a2 0($a0)
addiu $a0 $a0 2
beqz $a2 shift
b loop
shift:
lhu $a2 0($a0)
sh $a2 -2($a0)
sh $zero 0($a0)
li $v0 1
b loop
end:
lw $a0 8($sp)
lw $a1 4($ap)
lw $a2 0($ap)
addiu $sp $sp 12
jr $ra
With my tests I found out, that shift never get called and $a2 have different values over the runningtime, also 0.
I hope I could make my problem clear.
I am really thankful for any help.
Edit:
.data
.globl main
message:
.asciiz "move_one returned: "
board:
.half 0,0,2,0
.half 0,0,0,0
.half 0,0,0,0
.half 0,0,0,0
buf:
.word 0,0,0,0
.text
main:
la $t0 board
la $t1 buf
sw $t0 0($t1)
addiu $t0 $t0 2
sw $t0 4($t1)
addiu $t0 $t0 2
sw $t0 8($t1)
addiu $t0 $t0 2
sw $t0 12($t1)
la $a0 buf
la $a1 4
jal move_one
move $t0 $v0
la $a0 message
li $v0 4
syscall
move $a0 $t0
li $v0 1
syscall
li $v0 11
li $a0 10
syscall
li $a1 16
la $a0 board
jal print_board_test
li $v0 10
syscall
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论