MIPS - 在变量中打印值

时间:2013-04-16 04:37:16

标签: mips system-calls

以下是代码:

.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;
}

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我解决它的方法毕竟只是使用printf调用。 Syscalls从未为我工作过;甚至是答案中描述的方式。

因此要打印值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