【问题标题】:MIPS assembly a simple for loop (2)MIPS组装一个简单的for循环(二)
【发布时间】:2019-03-24 06:23:29
【问题描述】:

这是我在 MIPS 中学习循环的第一次尝试。

.data
    spc: .asciiz ", "

.globl main

main:
    li $t0, 0

loop:
    bgt     $t0, 14, exit # branch if($t0 > 14) 
    addi    $t0, $t0, 1 # $t0++ for loop increment

    # print a comma
    la  $a0, spc # copy spc to $a0 for printing
    li  $v0, 4 # syscall value for strings
    syscall

    # repeat loop
    j   loop

exit:
    li  $v0, 10 # syscall value for program termination
    syscall

输出:

 -- program is finished running (dropped off bottom) --

这个程序应该在 I/O 控制台中打印 15 个逗号。这没有发生。

可能是什么问题?

参考:MIPS assembly for a simple for loop

【问题讨论】:

  • # copy spc to $a0 不,那条评论是错误的。 la 设置$a0 = 标签的地址。它不会从任何地方复制 spc;它必须从立即数据中实现寄存器中的静态地址。 (比如lui/ori)。

标签: loops assembly mips


【解决方案1】:

您将所有代码组装到.data 部分;你从未切换回.text

如果您使用 MARS,则 GUI 不会在反汇编中显示任何 asm 指令(在汇编之后)。这就是原因。

显然,MARS 并没有因为main 在一个不可执行的页面中而出错,而是在您启动程序后立即确定该程序“掉到了底部”。

【讨论】:

  • 链接页面中显示的其他程序呢?
  • @user366312: 怎么样?在main: 之前添加.text 可以使您的代码正常工作;我没有看到需要回答的问题的任何其他部分。
  • @user366312:是的,确实如此。它永远不会切换到.data 段,因此它是.text 段中的all
  • @JörgWMittag,哦,明白了。
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多