2017-10-23 6 views
0

私はコマンドラインから10の整数を読み込み、その値の合計をサブルーチンで出力します。ARMサブルーチン内でスタック上の値にアクセスするにはどうすればよいですか?

私は、次の適切なコードを持っている:あなたがいることをどのように行うのですか、私は戻ってスタックを通じ10回反復し、私はちょうどで読み値の合計を取得したいと思い、私の和サブルーチンで

... 

sub sp, sp, #40 // making room on the stack 
mov r4, sp  // use r4 as our working register for where we are in our space 
    loop: 
     (looping through this 10 times) 
     ldr r0, =rdfmt 
     mov r1, r4 
     bl scanf 
     add r4, r4 #4 
    done: 
     bl sum 
sum: 
    push {lr} 
    (how do I load those back in from the stack?) 

... 

を。 ?

+0

あなたは 'sum'に戻ります。(' bx lr'または 'pop {pc}'を省略したと思いますあなたの最初の関数の最後に、あなたがループの一番下のループブランチを残したようなのでしょうか?) 'sum'がリーフ関数であれば' lr 'を押す必要はありません。 bx lr'または 'mov pc、lr' –

答えて

4

ほとんどのCISC CPU(x86、m68k ...)と異なり、ARM CPUは関数呼び出し時にスタックポインタ(sp)を変更しません。しかし、push命令を実行するときにスタックポインタから4を減算します。

bl sum命令を実行するとき、spレジスタが指し示すアドレスから開始して10個の整数がメモリに配置されます。 push {lr}命令の後では、これらの整数はまだその位置にありますが、spの値は4より小さくなります。したがって、10個の整数はアドレスsp+4にあります。

アドレスsp+4の最初の整数をレジスタにロードします。その後、アドレスsp+8の整数を別のレジスタにロードし、両方のレジスタを追加します。 sp+12などの整数でこれを繰り返します...

+0

偉大な答えをありがとう!私は 'ldr r0、[sp、#+ 4]'を使ってスタックの値をロードしていますが、これは私がサブルーチンを実行しようとするたびにseg faultを引き起こしているようです。そこに構文エラーがありましたか? – FactorialTime

関連する問題