問題タブ [thumb]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - Cortex M3 上の非 Thumb ARM コード
Cortex M3 で実行しようとしている ARM コードがいくつかあります。私のコードの大部分は、C からコンパイルされた Thumb で書かれていますが、一部の関数については、通常の ARM コードを実行できるようにしたいと考えています (私が理解しているように、これは M3 で可能ですか?)。
そう...
元の C コードとアセンブリ:
を使用してコンパイルarm-none-eabi-gcc -mfloat-abi=soft -nostdinc -nostdlib
私はこれに - で分岐しますblx r4
。これは、ベース アドレス &3 が 0 の場合に交換する必要があります。
これを GDB でステップ実行すると、アドレスに正しいデータが含まれていても、表示されている行に到達するとすぐに HardFaults が発生します。
コード (BLX を使用) は Thumb コードに対して完全に機能しますが...
何が起こっているのか分かりますか?ありがとう!
arm - 位置に依存しないコードを持つ親指関数ポインタ?
私は関数caller
が引数として親指関数ポインタを取るようにしたい:
でコンパイルすると
そしてリンク
、リンカーはインターワーク コードでラップしようとfun
し、インターワークが有効になっていないことを警告します。しかし、私はそれを親指だけのコードにしたいので、インターワークを有効にしたくありません。がなければ-fpic
、コードはコンパイルされ、関数ポインタは正しく機能します。
サム関数ポインターを渡して PIC コードを提供する必要がある理由を知りたい場合は、API を変更できないためです。
編集: Gcc のバージョンは 4.7.2 です。指定-march=armv4t -mcpu=arm7tdmi
しても役に立ちませんでした。
assembly - ARM/Thumb-2 命令セットとアセンブリ
まず第一に、私は ARM アセンブリに関しては初心者です。実際には ARM 命令セット用に書かれたコードがいくつかありますが、ターゲットは Thumb-2 命令セットを使用する Cortex-M4 アーキテクチャです。コード全体を書き直すか、一部を変更するか、そのままにしておく必要がありますか?
実際には、それぞれ約 250 行のファイルがいくつかあります。ここにサンプルがあります
assembly - 異なる命令を示す同じバイナリの逆アセンブル
私のアプリケーションでは at91sam4e16e マイクロコントローラーを使用しており、starter_kit_bootloader_demo という名前のブートローダーには ASF(xdk-1.15.0) のブートローダーの例を使用しています。
今、sam4e-ek 用にプロジェクトをカスタマイズしました。そのブートローダーを使用してバイナリを更新しようとしています。
更新後、両方のバイナリファイルを比較しました1)更新
および 2) スタンドアロン
両方のバイナリは同じですが、IAR でデバッグすると、逆アセンブリで命令が異なることが示されます。なぜ違うのですか?
assembly - ARM アセンブリ コードと SVC の番号付け
ARMアセンブリコードでは、次のようなものを見ることができます...(特にシェルコードで)
「svc(または swi)」は、Intel の「int 0x80」や「SYSENTER」のような「スーパーバイザー呼び出し」であることを知っています。しかし、「svc」番号をどのように解釈できますか?? その情報のリストはどこで入手できますか?? 親指の「svc」命令はどうですか??
アームの取扱説明書はこれらを説明していないようです...
誰かが私を助けることができますか?前もって感謝します。
arm - ARM ThumbEE 自動ヌル ポインタ チェック
ARM では、Thumb-EE 命令セットが自動ヌルポインタ チェックをサポートしています。
ARM マニュアルには、thumb-EE 命令がヌル ポインターを参照しようとすると、「ハンドラーが呼び出される」と記載されています。しかし、このハンドラーのアドレスを設定するのは誰でしょうか? そしてどのように?、いつ?ARM Thumb-EE マニュアルから回答が得られません。
gcc - ARM Thumb-2、GCC、コードの変更、および `stmdaeq` 命令
私は STM32F4 (Cortex-M4) MCU を使用しており、arm-none-eabi-g++ でコンパイルしています (C++ を使用しています)。
バイナリを MCU のフラッシュ メモリにアップロードするのにかかる時間を短縮する必要があります。変更の間にバイナリに変更をアップロードするだけでこれを行うことができることがわかりました。ただし、コンパイラはこれを不可能にする興味深いコードを生成しています。
次の 2 つのプログラムを検討してください。
(1)
(2)
呼び出しを削除するだけprintf
で、バイナリは大幅に異なります。を使用してコードを逆アセンブルすると、これを確認できますarm-none-eabi-objdump -D mybinary
。WinMerge の違いの例を次に示します。
画像でわかるように、ほぼすべての関数でstmdaeq
命令が少し異なりますが、これについてもっと知りたいと思っています。
この質問への回答には、次のものが含まれます。
- 命令が何であるかは知ってい
stmdaeq
ますが、ほとんどすべての関数の最後にあるのはなぜですか? これは機能のエピローグですか? - 上記の例のような小さなコード変更がバイナリ全体でそのような変更を引き起こさないようにするためにできること (コンパイラ オプションなど) はありますか?
GNU Tools for ARM Embedded Processors GCC ツールチェーンを使用しています。
あなたの助けが最も高く評価されます。
c++ - GCC --gc-sections とシンボルの依存関係の検索
elf 実行可能ファイルのサイズを縮小しようとしています。でコンパイル-ffunction-sections
-fdata-sections
およびリンクして-gc-sections
いますが、使用されていないと思われるシンボルの一部が破棄されていないようです。
どのシンボルがどこで使用されているかを調べるために実行できる GNU ツールチェーンのコマンドはありますか?
- ツールチェーン: GNU arm-none-eabi
- プラットフォーム: Cortex-M4
- 言語: C++
私の典型的なビルドフラグは次のとおりです。
コンパイル:arm-none-eabi-g++.exe -Wall -O3 -mthumb -std=c++11 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -fsingle-precision-constant -ffunction-sections -fdata-sections
リンク:arm-none-eabi-g++.exe -static -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wl,-gc-sections -Wl,-T"LinkerScript.ld
助けてくれてありがとう。