1

私はARMアセンブラで書かれた単純な関数を持っています。初めて実行すると、すべてが期待どおりに機能します (出力されますBOOT\n)。ただし、関数が 2 回目に実行されると、何も出力されません。

.globl __printTest
.text
.align 2

__printTest:
 sub sp, #64 /* yes, I know this is too much */

 mov r0, #66
 str r0, [sp]
 mov r0, #79
 str r0, [sp, #1]
 mov r0, #79
 str r0, [sp, #2]
 mov r0, #84
 str r0, [sp, #3]
 mov r0, #10
 str r0, [sp, #4]

 mov r0, #0
 mov r1, sp
 mov r2, #5

 bl _write
 add sp, #64

 bx lr

問題は何ですか?これにより、バッファが機能しなくなったことがどういうわけか台無しになっているのではないかと思います。Write は、命令writeを使用して Linux で syscallを呼び出す関数です。svc

4

2 に答える 2

4

問題は、保存していないことですlr

     bl _write
     add sp, #64
     bx lr

bl _writelrwhichは を上書きするadd sp, #64ためbx lr、最後の 2 つの命令で無限ループが発生します。

次のようにコードを変更すると、機能するはずです。

__printTest:
 push {lr}
 sub sp, #64 /* yes, I know this is too much */
 ....
 bl _write
 add sp, #64
 pop {pc}

別の回答で既に述べたように、バイトストアには str の代わりに strb も使用する必要があります。

于 2012-04-18T18:26:49.227 に答える
3

この関数は、32 ビット値をアラインされていないスタック ポインター アドレスにプッシュしています。strbシングルバイトの書き込みに使用する必要があります。unalignedstrの場合、ARM アーキテクチャ リファレンス マニュアルには次のように記載されています。

if UnalignedSupport() || address<1:0> == ‘00’ then
    MemU[address,4] = R[t];
else // Can only occur before ARMv7
    MemU[address,4] = bits(32) UNKNOWN;

そのため、構成によっては、不明なケースに遭遇した場合、スタックにジャンクが発生する可能性があります。

于 2012-04-18T18:21:21.113 に答える