-1

以下是代码:

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

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

4

2 回答 2

1

我解决它的方法毕竟只是简单地使用 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
于 2013-05-01T00:21:49.610 回答
1

您添加的代码:

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

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

  lw $a0, 8($fp)   # Load contents of variable i onto register $a0
  li $v0, 1        # service 1 (print integer)
  syscall          # issue service
于 2013-04-16T14:11:44.357 回答