2017-04-12 55 views
1

所以,我最近做了一个代码来计算C代码和MIPS代码中二进制1的数量。我通过使用余数值并增加一个count_one变量在C中这样做。在MIPS中,我做了同样的程序,但我移动了数字的字节,直到它将所有的1计算在内。不过,我想试着学习如何使用指针,但我似乎无法理解这个概念。我的MIPS代码如下:如何操作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工作和读书我还是不明白后不确定。任何关于如何实现指针的建议?

回答

1

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

例如在伪代码

inc $a0 

此命令增量寄存器$a0与它的工作的数据作为带有数

lw $s1, 0($a0) 

此命令负载从存储器通过与它寄存器$a0工作如指出数据使用指针

+0

谢谢。我想我的主要困惑是声明内存大小,并找出如何基于8,4,0($ sp)行来实现我的变量。 – CodeFreak

+0

我很乐意提供帮助。祝你好运。 – oklas

+0

你能解释一下整个分配足够的内存部分吗? – CodeFreak

1

下面是一个示例代码,用于翻译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 $t1 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 $s0 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 $s0 for caller 
     lw $t0, 4($sp)  #restore register $t0 for caller 
     lw $s0, 8($sp)  #restore register $t1 for caller 
     addi $sp, $sp, 12 #adjust stack to delete 3 items 

     jr $ra   #jump back to calling routine