問題タブ [jump-table]

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.

0 投票する
1 に答える
197 参照

assembly - MASMアセンブリ言語で前方参照を実行するには?

私がやろうとしているのは、ループの最後でメインループに (永遠に) 戻るだけの前方参照を作成することです。今のところ、無効、正、負の各ラベルの最後に「jmp jumpToMainLoop」と書くと、メイン ループに戻る方法しかわかりません。プログラムがループの最後にのみフォーエバーにジャンプするようにプログラムを調整するにはどうすればよいですか?

0 投票する
1 に答える
4614 参照

flash - アプリケーション プログラミングで STM32 を開発するための戦略

In Application Programming モジュールの開発方法についてのアイデアを探しています。

Androidシステム用のSTM32F2xx接続ボックスを「C」で開発しました。本質的に、これは単なるマルチデバイスから Bluetooth への情報ブリッジです。現在、物理的な接続を必要とせずに、Bluetoothシリアルポートから将来このボックスをアップグレードするための「アプリケーションプログラミング」モジュールを提供する方法を考えています。

私にとって、フラッシュへの読み取りまたは書き込みは問題ではありませんが、プロセッサがプログラムを実行する方法、プログラムを異なるフラッシュの場所に分割する方法、およびフラッシュ メモリの具体的なアドレスにジャンプする方法を理解する必要があります。この情報はどこで検索できますか?

0 投票する
0 に答える
379 参照

compiler-construction - C/C++ スイッチ/ケース ジャンプ テーブル情報のエクスポート

x86-64 上の C/C++ では、switch/case ステートメントが比較的大きい (3 または 4 エントリを超える) 場合、条件付きジャンプ命令ではなく、LLVM によってジャンプ テーブルが生成されます。

Clang/LLVM で、これらのテーブルのベース、インデックス、およびスケール情報をエクスポートする方法は? プログラムのソースコードが利用可能です。

たとえば jmpq *0x400000(,%rbx,8)

0x400000ベース、値と比較されるインデックス値%rbx、およびスケールをエクスポートする方法は8?

0 投票する
1 に答える
1074 参照

c - 関数ポインタまたはジャンプ テーブル

質問をする前に、背景を説明させてください。

Autosarに関する技術記事を読んでいましたアプリケーション層ソフトウェア コンポーネントのプラグ アンド プレイ アプローチを提案したアーキテクチャ。基本的に、この記事では、メモリを個別のコンポーネントに分割し、ソフトウェア イメージ全体ではなく、変更されたコンポーネントのみをプログラム /flash できることを提案しました。これにより、ディーラー訪問時の再プログラミング時間を節約できます。再プログラムされる関数のアドレスが変更される可能性があるため、これらの変更された関数が別のパーティション (メモリのセクション) にある関数によって呼び出されると、問題が発生します。この記事では、固定アドレスにあり、更新された関数のアドレスを含むジャンプ/間接テーブルを使用して、このアプローチの解決策を提案しています。

それでは、質問の部分に行きましょう:

私はこの問題をAutosarアーキテクチャからではなく、組み込みエンジニアの観点から考えていました。このアプローチは機能しますが、スループットの向上につながると考えました。私が使用できると思った別のオプションは、おそらく関数ポインターです。しかし、通常のシナリオでは、関数シンボル名を実際のアドレスに置き換えるのはリンカであると考えたため、関数 A (変更されていないパーティションにある) が関数 B (更新されたパーティションにある) に初期化され、おそらく別のアドレスにあります)は機能しません。

これは最終的に私の最後の質問に私をもたらします:

  1. 関数ポインターのアプローチは機能しますか? (多分無いと思います。)
  2. 上記の質問に対する答えが「いいえ」の場合、すべての関数ポインターを固定アドレスに保持し、スクリプトとマップ ファイルを使用して実際のアドレスにパッチを適用するなど、関数ポインター アプローチを使用できますか。

こんなに長い質問に辛抱強く答えてくれた皆さんに感謝します。もっと小さな質問を思いつくことができればいいのにと思います。

0 投票する
1 に答える
5525 参照

c - x86 アセンブリ ジャンプ テーブルを C に変換する

この x86 アセンブリ コードがあり、C に変換しようとしています。

jmp *operations(,%ecs,4)ラインについて質問です。これは switch ステートメントだと思います。メモリ内でどのように機能するかはわかっていますが、これを C に変換するにはどうすればよいでしょうか。スイッチを作成するために、それらの場所のスタックに何があるかを知る必要はありませんか?

これは私が持っているものです:

0 投票する
2 に答える
1389 参照

interrupt - 割り込みベクタ テーブル: 一部のアーキテクチャでは、「ジャンプ テーブル」と「ポインタの配列」を使用するのはなぜですか?

いくつかのアーキテクチャ (x86 など) では、Interrupt Vector Table (IVT) は、実際には Tin に記載されているものです:ベクトルのテーブル、別名 pointersです。各ベクトルは、割り込みサービス ルーチン(ISR) のアドレスを保持します。割り込み要求(IRQ) が発生すると、CPU は一部のコンテキストを保存し、ベクトルをPCレジスタにロードして、ISR にジャンプします。ここまでは順調ですね。

しかし、他のいくつかのアーキテクチャ (ARM など) では、IVT にはポインタではなく実行可能コードが含まれます。IRQ が発生すると、CPU は一部のコンテキストを保存し、ベクトルを実行します。しかし、これらの「ベクトル」の間にスペースがないため、そこに ISR を格納する余地がありません。したがって、各「ベクトル命令」は通常、メモリ内の別の場所にある適切な ISR にジャンプするだけです。

私の質問は、後者のアプローチの利点は何ですか?

ISR 自体がよく知られているアドレスを固定しており、合理的な IRS が適切な場所に収まるように間隔を空けて配置されているかどうかは、ちょっとわかります。次に、断片化を犠牲にして、1 つの間接化レベルを節約します。しかし、この「コンパクト ジャンプ テーブル」アプローチには、まったく利点がないように思われます。私は何を取りこぼしたか ?

0 投票する
0 に答える
99 参照

assembly - FPC ASM でのジャンプ テーブル操作の整列

私はこのようなジャンプテーブルを持っています:

これは、jmp コードの長さが 2 バイトであることを理解していれば、完全に機能していました。その後、@@seg にコードを追加しましたか? これにより、「さらに離れた」コード セグメント (ラベル) にジャンプするとクラッシュが発生するようになりました。

長いジャンプは 2 よりも長い長さでエンコードされていると結論付けています。残念ながら、私が使用している逆アセンブラはそのjmp rax行で停止するため、確認できません。しかし、結論は論理的です。

コンパイラにアラインさせる方法はありjmp @@segますか? ジャンプテーブルに十分な大きさと一貫したサイズが保証されるように、たとえば4バイトでコマンドを実行しますか? もしそうなら、私はrax4秒でインクリメントすることができます.

nopこれを解決するために、手動で 's を追加したくありません。

0 投票する
1 に答える
2684 参照

c - アセンブリ コードと switch ステートメントのケース

50、52 などのケースがアセンブリ言語でどのように決定されたかを理解するのに少し苦労しています。

私が理解していることから、ジャンプ テーブルは各ケースで実行するアクションに対応し、edx > 5 のチェックはケースが 0 から 5 の範囲であることを意味しますか? 1 はデフォルトのケースなので省略されていると思いますが、5 が省略されているのはなぜですか?

ケース 55 があるべきだと思います: where result *= result, no?

誰かが説明を手伝ってくれるなら、それは素晴らしいことです。ありがとうございました!

図 3.38 に、逆アセンブルされたプロシージャのオブジェクト コードを示します。4 行目から 16 行目に示されているコードの部分のみに注目します。4 行目で、パラメーター x (%ebp に対するオフセット 8) がプログラム変数 result に対応するレジスター %eax にロードされていることがわかります。11 行目の「lea 0x0(%esi), %esi」命令は、12 行目の命令を 16 の倍数のアドレスから開始させるために挿入された nop 命令です。

ジャンプ テーブルは、メモリの別の領域にあります。デバッガー GDB を使用して、コマンド x/6w 0x8048468 を使用して、アドレス 0x8048468 で始まるメモリの 6 つの 4 バイト ワードを調べることができます。GDB は以下を出力します。

アセンブリ コード: