2017-04-12 7 views
1

私は最近、CコードとMIPSコードでバイナリ1の数を数えるためのコードを作成しました。私はCで余りの値を使い、count_one変数をインクリメントします。 MIPSでは、同じプログラムを実行しましたが、1のすべてを数えるまで、そのバイトのバイトをシフトしました。 Howver、私はポインタを使う方法を学びたいと思っていますが、私はそのコンセプトを理解しているようには見えません。次のように私の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作業でこのコマンド増分データとして持つレジスタ$a0ワークによって指し示さメモリからこのコマンド負荷データ数

lw $s1, 0($a0) 

と同様ポインタ付き

+0

ありがとうございました。私の主な混乱は、メモリサイズを宣言し、8,4,0($ sp)行に基づいて変数を実装する方法を考え出すことです。 – CodeFreak

+0

私はお手伝いします。がんばろう。 – oklas

+0

あなたは十分なメモリ部分を割り当てる全体を説明できますか? – CodeFreak

1

ここには、流れるCコードをMIPSで変換するコード例があります。 保存されたレジスタを保存して復元するには、スタックにいくつかの場所を作成してから、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 
関連する問題