2016-11-28 8 views
1

私は3つのパラメータを持っており、それらをR1、R8、R9という3つの異なるレジスタに格納します。私は、複数のプッシュが完了したらPUSH {r1、r8 ...など}私がメモリ内で見つけるものは、プッシュ{r9、r8、R1}と同じです。アセンブリの複数のプッシュは、プッシュリストの注文を考慮していません

実際には値が異なります.R9は1000、r1とr8は両方とも50未満です。命令で書いた順番にプッシュされないのはなぜですか?

実際には、私が注文r8、r9、r1を取ったとしても、それらを再びスタックにr9、r8、r1の下から上に格納します。

PUSH {r1,r8,r9}PUSH {r9,r8,r1}と同じではないと考えていました。

+4

マシンエンコーディングは、押さなければならないビットマップです。可変注文をエンコードする余地はありません。なぜなら、それはもっと多くのビットを要するからです。プッシュオーダーが制御可能であるというプログラマの間違った希望を黙って無視するのではなく、アセンブラが 'push {r9、r8、r1}'のような順不同プッシュを受け入れることを拒否すれば、おそらく良いでしょう。 –

+0

@PeterCordes従って、私は複数のプッシュをどのように適用しているかに関わらず、スタックの最下位から最上位に20 11 1000を格納することはできません。代わりにスタックに1000 11 20 bottom-topが常に表示されます。私はレジスタで値を取得し、値をプッシュし、3番目の値をプッシュすることによってそれを行うことができますが、それはタスクではありません。タスクでは、最適化が必要なので、適切な順序で複数の3つのレジスタを一度にプッシュすると、2つの命令が保存されます。 – KDX2

+2

それで最初に適切に順序付けられたレジスタにデータを移動してください;) – Notlikethat

答えて

7

どのプロセッサを使用しているのかはわかりませんが、アセンブリはARMのように見えます。 PUSHおよびPOPはSTMDBとLDM(またはLDMIA)の同義語は、ベースレジスタSP(R13)、 とベースレジスタに書き戻す調整アドレスであるARM - Push

説明で述べたように

。これらの場合、PUSHとPOPが好ましいニーモニックです。あなたが使用しなければならない何らかの理由であなたがスタック上に特定の順序で物事を格納する必要がある場合 レジスタは、最下位アドレス

で最も小さい番号のレジスタで、番号順にスタックに保存されています複数の命令。

については、なぜそのケースの質問です。コメントとして、Peter Cordesが述べたように、それはレジスタリストが命令のビットフィールドとして格納されているためです。 ARMのARMから(ARMアーキテクチャリファレンスマニュアル)LDM/STM命令の符号化は、それが格納r0は、R8およびR9は、ビット0、8、および9の設定であろうことを確認することは明らかだ。このことから

Bit 31 -- 28 27 26 25 24 23 22 21 20 19 -- 16 15 -------- 0 
    COND  1 0 0 P U S W L Rn  Registers 

(0x0301命令の下位16ビットで)、コードで記述されている順序にかかわらずです。

+0

0 <1 <2であるため、reg_list PUSH {reg_list}またはR0、R1、R2 <=> R1、R2、R0 <=> R2、R0、R1 ...の中で最も小さい数値の順序が常にR0、R1、R2として格納されます。 R0はスタックの一番下にありますか?これはARMです。私は3つの組み合わせ、r9、r8、r0をプッシュしようとしました。私はr0、r8、r9とr8、r0、r9を試してみました。得られた結果は、底面が常にr9、真ん中がr8、上がr0です。 。すべての組み合わせで。私はR0の値をR9に格納しようとしましたが、R9〜R0の1つは同じものを再び格納しました。 – KDX2

+2

リストの順序とは無関係に、最も低い番号のレジスタをリストの最下位アドレスに格納します。したがって、スタックが減っている(物が下位のアドレスにプッシュされている)場合は、r0が一番上になり、r8、r9の順になります。これはあなたが見ているものです。 あなたが指定した順番でなければならない場合は、 'PUSH r0'、' PUSH r8'、 'PUSH r9' –

+0

@ KDX2:あなたの質問に私のコメントを見てください。これは、異なるプッシュオーダーがエンコード可能ではないために発生します。 –

関連する問題