【问题标题】:How to manipulate MIPS code and use stack pointers?如何操作 MIPS 代码并使用堆栈指针?
【发布时间】:2017-04-12 03:32:47
【问题描述】:

所以,我最近编写了一个代码来计算 C 代码和 MIPS 代码中二进制 1 的数量。我在 C 中通过使用余数并增加 count_one 变量来做到这一点。在 MIPS 中,我执行了相同的程序,但我移动了数字的字节,直到它计算出所有的 1。但是,我想尝试学习如何使用指针,但我似乎无法掌握这个概念。我的 MIPS 代码如下:

.data
  prompt: .asciiz "Enter a integer: "

.text
  li $v0,4
  la $a0, prompt
  syscall

  li $v0,5
  syscall
  move $s0,$v0
  j count

count:
  beq $s0,0, exit
  andi $t0,$s0,1
  add $t1,$t1,$t0
  srl $s0,$s0,1
  j count

exit:
  move $a0,$t1
  la $v0,1
  syscall
  li $v0,10
  syscall

我得到了这个完整的 MIPS 代码,但我不确定指针在 MIPS 中是如何完全工作的,阅读后我仍然不明白。关于如何实现指针有什么建议吗?

【问题讨论】:

    标签: c pointers stack mips stack-pointer


    【解决方案1】:

    最常见的命令决定了数据的思想。

    例如在伪代码中

    inc $a0
    

    这个命令增加寄存器$a0中的数据,就像使用数字一样

    lw $s1, 0($a0)
    

    此命令从寄存器$a0 指向的内存中加载数据,使用它就像使用指针一样

    【讨论】:

    • 谢谢。我想我的主要困惑是声明内存大小并弄清楚如何根据 8,4,0($sp) 行来实现我的变量。
    • 我很乐意提供帮助。祝你好运。
    • 你能解释一下整个分配足够内存的部分吗?
    • 不明白你的意思,可能这是另一个问题。内存分配是操作系统的责任。您需要调用函数来分配内存。它需要阅读你的操作系统的手册。
    【解决方案2】:

    这是一个在 MIPS 中转换流动 C 代码的示例代码。 为了保存和恢复保留的寄存器,它在堆栈上占据了一些位置,然后使用swlw 来保存和恢复这些寄存器。

    int leaf_example(int g, int h, int i, int j) {
        int f;
        f = (g + h) - (i + j);
        return f;
    }    
    
    
    
    .text
     main:
    
            addi $a0,$0,1       #argument 0 = 1
            addi $a1,$0,2       #argument 1 = 2
            addi $a2,$0,3       #argument 2 = 3
            addi $a3,$0,4       #argument 3 = 4
            jal  leaf           # call function leaf
            add  $s0,$v0,$zero  # return value
    
            li $v0,10
            syscall
    
    
        leaf:
            addi $sp, $sp, -12  #adjust stack to make room for 3 items
            sw $s0, 8($sp)      #save register $s0 for use in memory location 8
            sw $t0, 4($sp)      #save register $t0 for use in memory location 4
            sw $t1, 0($sp)      #save register $t1 for use in memory location 0
    
            add $t0, $a0, $a1   #register $t0 contains $a0 + $a1
            add $t1, $a2, $a3   #register $t1 contains $a2 + $a3
            sub $s0, $t0, $t1   #$t0 = $t0 - $t1 -> $t0 = ($a0 + $a1) - ($a2 + $a3)
    
            add $v0, $s0, $zero #copy $s0 to return register $v0
    
            #Before returning, we restore three original values 
            #of registers we pushed onto stack by popping them
            lw $t1, 0($sp)      #restore register $t1 for caller
            lw $t0, 4($sp)      #restore register $t0 for caller
            lw $s0, 8($sp)      #restore register $s0 for caller
            addi $sp, $sp, 12    #adjust stack to delete 3 items
    
            jr $ra         #jump back to calling routine
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多