从MIPS中的内存加载值不正确

发布于 2025-01-26 08:17:45 字数 1397 浏览 1 评论 0原文

贪婪, 我正在火星上进行一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文