だから、2(まあ、それは現在のタスク+ 1
にプラス一つのことをしてR0とR1をロードします
10648: e1a00003 mov r0, r3
1064c: e51b1010 ldr r1, [fp, #-16]
10650: eb00fd36 bl 4fb30 <____aeabi_uidivmod_veneer>
私は、彼らがARMからThumbに切り替えるために_veneerを使用推測、それはモードを切り替えるためのトランポリンです:
0004fb30 <____aeabi_uidivmod_veneer>:
4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4>
4fb34: 00010905 .word 0x00010905
、ここでは実際の剰余演算をあなたを取ること、これはThumbコードであります、親指モード
00010904 <__aeabi_uidivmod>:
10904: 2900 cmp r1, #0
10906: d0f8 beq.n 108fa <__aeabi_uidiv+0x252>
10908: e92d 4003 stmdb sp!, {r0, r1, lr}
1090c: f7ff fecc bl 106a8 <__aeabi_uidiv>
10910: e8bd 4006 ldmia.w sp!, {r1, r2, lr}
10914: fb02 f300 mul.w r3, r2, r0
10918: eba1 0103 sub.w r1, r1, r3
1091c: 4770 bx lr
1091e: bf00 nop
だから、それは通常の除算を行うことになります、その結果を乗算し、問題が親指モードである場合、私は疑問に思う例えば
12345 % 100 = 12345 - ((12345/100)*100) = 12345 - (123*100) = 12345 - 12300 = 45
を減算します。 arm1176は間違いなく親指モードを持っていて、私はqemuが親指をすることができます。
あなたは、アセンブル、リンクを見つけるためにかかわらず、実験を試みることができる:
.thumb
.thumb_func
.globl thumb_test
thumb_test:
add r0,#1
bx lr
arm-none-linux-gnueabi-as thumb_test.s -o thumb_test.o
か、どのようなツールチェーンの接頭辞があればあり、そして他のすべてと中の.oファイルをリンクします。 Cコードで
は
unsigned int thumb_test (unsigned int);
と何でもあなたがあなたの代わりにモジュロのこれを試して...その値プラスワンバックを取得する必要があり、それを渡すとしてそれを宣言する。
もう1つ試してみると分かりますが、除算はモジュロではなく分かりますか、多分問題は乗算命令ですか?知るか。
うーむが、私は問題を参照してくださいと思う:それは親指を実行しようとしたとき
0004fb30 <____aeabi_uidivmod_veneer>:
4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4>
4fb34: 00010905 .word 0x00010905
あなたはそれがBXまたはBLXにする必要がありLDRでモードを切り替えるカント、それはおそらく未定義のハンドラに起こっていますアームモードのコード。
私は、スイッチングモードがどのように動作する必要があるかの例を挙げています。特に、qemu用に書かれています。今これは低レベルの例です。例えばprintfはありません。私は、uartの出力を持っています。これが問題の場合(親指モードに切り替える)、プログラムのコンパイルとリンクの方法を調べる必要があります。インタワークを指定する必要があるかもしれませんし、以前はコードソーシング(現在はメンターグラフィックスによって消費されている)ツールチェーンを使用していない場合、ツールチェーンの構築方法を理解する必要があります。これはgnu/gccベースのものを使用していると仮定しています。
未定義のハンドラを置く方法がある場合、またはトレースを見て、おそらく起こっているアドレス0x0000000の近くにあるPCのドロップを見ることができる場合は、あなたが私の小さなthumb_testのもので構築すると、bxの代わりにldrを使用してそこに着くと、それはまだクラッシュするはずはないでしょう...
あなたは逆アセンブリを調べる必要がありますあなたが作成したプログラムですか? qemuではなく、実際のハードウェアでこれを実行しましたか? –
https://singpolyma.net/test.asmで解体したコードを掲載しました(警告:非常に大きい!) - 実際のハードウェアにはアクセスできません。私の目標はQEMUです。 – singpolyma