【问题标题】:MIPS — print a value in a variableMIPS — 打印变量中的值
【发布时间】:2013-04-16 04:37:16
【问题描述】:

以下是代码:

.text
.ent    main
.type   main, @function
main:
.frame  $fp,24,$31      # vars= 8, regs= 1/0, args= 0, gp= 8

addiu   $sp,$sp,-24
sw  $fp,20($sp)
move    $fp,$sp
li  $2,1            # 0x1
sw  $2,12($fp)
li  $2,1            # 0x1
sw  $2,8($fp)

    # now print -------------------------------------
    li      $2,1
    li      $a0,10
    syscall

move    $2,$0
move    $sp,$fp
lw  $fp,20($sp)
addiu   $sp,$sp,24
j   $31
nop

我是如何生成这个的——通过编写一个程序:

int main(){
  int i = 1;
}

然后自己简单地添加了系统调用语句。我不确定这是对还是错。

【问题讨论】:

  • 它是否按预期工作?否则,您将不得不指定您尝试编译/运行此代码的环境,以及您遇到的错误。
  • 我的意思是,它可以正确编译并且运行没有任何错误。它不做的就是打印该死的东西!
  • 你在运行什么? SPIM/火星?如果您运行的程序只打印一个整数而什么都不做(即没有从编译器获得的堆栈帧设置代码)怎么办?

标签: mips system-calls


【解决方案1】:

你添加的代码:

   # now print -------------------------------------
    li      $2,1
    li      $a0,10
    syscall

在标准输出中打印整数 10。 如果您想打印变量i,您必须先将其值加载到寄存器$a0。 假设它尚未存储在寄存器中(顺便说一句,这是您的情况),并且它存储在堆栈中(相对于 $fp 的位置 8),您必须:

  lw $a0, 8($fp)   # Load contents of variable i onto register $a0
  li $v0, 1        # service 1 (print integer)
  syscall          # issue service

【讨论】:

    【解决方案2】:

    我解决它的方法毕竟只是简单地使用 printf 调用。系统调用从来没有为我工作过;甚至是答案中描述的方式。

    所以要打印值 10,我执行以下操作:-

        # printf initialized
    
        lui     $2,%hi($LC0)             # loading .ascii from $LCO
        addiu   $2,$2,%lo($LC0)
        move    $4,$2                # first argument to printf
        li      $5,10
        lw      $2,%call16(printf)($28)      # printf call to print contents of $5
        nop
        move    $25,$2
        jalr    $25
        nop
        lw      $28,16($fp)              # __printf__ end
    

    【讨论】:

    • 这看起来像是 Linux MIPS 的答案。另一个答案是 MARS/SPIM。该问题没有足够的标签可以知道,也没有任何信息让未来的读者知道使用哪个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2018-10-25
    相关资源
    最近更新 更多