問題タブ [x86]
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 - 割り込みハンドラから戻る前に、特定の例外によってスタックにプッシュされたエラー コードをポップする必要がありますか?
256 のエントリを持つ idt テーブルをロードしました。すべて同様のハンドラを指しています。
- 例外 8 および 10 ~ 14 の場合は、例外番号をプッシュします (これらの例外はエラー コードを自動的にプッシュします)。
- その他の場合は、「ダミー」エラー コードと例外番号をプッシュします。
- 次に、共通ハンドラにジャンプします
したがって、共通ハンドラーが入ると、スタックは適切に配置され、例外/割り込み番号、エラー コード (単なるダミーの可能性があります)、eflags、cs、および eip が含まれます。
私の質問は、割り込みハンドラからの復帰に関するものです。以前はiret
スタックから例外番号とエラー コードを取り出してリターンしていましたが、例外番号 8 では機能しません。スタックにエラー コードを残すと、正常に返されます。
質問:
- エラーコードをそこに置く例外のために、エラーコードをスタックに残す必要がありますか?
iret
もしそうなら、エラーコードをポップする必要があるかどうかをどのように判断しますか? - 割り込みを有効にするとすぐに、常に例外 8 (二重障害) が発生しますが、その後はすべて正常に動作します (私は趣味の OS を開発しています)。これは正常な動作ですか、それともどこかにバグがありますか?
linux - ARM アーキテクチャ向け Linux クロスコンパイル
x86 ホスト上の ARM ターゲット用に Linux カーネルをクロスコンパイルすることに興味があります。あなたが推奨するいくつかの良い習慣はありますか? あなたの意見では、どのクロスコンパイル スイートが最適ですか? カスタムのクロスコンパイル環境を整えましたか? はいの場合、どのようなアドバイスがありますか? それは良い考えですか?
gcc - gcc 出力に余分な命令があるのはなぜですか?
GCC コンパイル (を使用gcc --omit-frame-pointer -s
):
の中へ
ここで '$12' 定数は何をしているのですか? また、'%esp' レジスタは何ですか?
gcc - .com とはどういう意味ですか?
このプログラムを翻訳したところ、
gccプロデュースを使って組み立てる、
.com とはどういう意味ですか? dam はヒープ領域、スタック領域、またはデータ領域を使用しますか?
assembly - x86命令「call dword ptr ds:[00923030h]」の意味は何ですか?
次の x86 アセンブラー命令は何をしますか?
これは間接的な呼び出しだと思いますが、呼び出しのアドレスを正確にどのように計算するのでしょうか?
c++ - MSVC++ でバイトコードを調べる際の問題
私は職場で無料の Digital Mars Compiler をいじり回しており (いたずらなことはわかっています)、コンパイルされた関数を検査し、学習目的でバイト コードを調べるためのコードを作成しました。その機能。ただし、MSVC++ で同じメソッドを再作成することは惨めに失敗し、得られた結果は非常に混乱しています。私はこのような機能を持っています:
その後、私は次のことを行います。
この場合、C++ static_cast を動作させることができないようです (コンパイラ エラーがスローされます)。したがって、C スタイルのキャストですが、それは重要なことではありません。また、参照 &test を使用してみました。しかし、それは何の助けにもなりません。
ここで、testCode が指すメモリの内容を調べると、有効なコードのようにも見えず、そこにデバッグ ブレークポイントが残っているため、混乱します...次のようになります (ターゲットは IA です) -32):
0xe9、0xbc、0x18、0x00、0x00、0xcc...
これは明らかに間違っています。0xe9 は相対ジャンプ命令であり、0xbc バイト先を見ると次のようになります。
0xcc、0xcc、0xcc...
つまり、割り当てられていないメモリまたは未使用のメモリに対して予想されるように、メモリはデバッグ ブレークポイント オペコードに初期化されます。
42 を返す関数に期待するのは次のようなものです。
0x8b、0x2a、0x00、0x00、0x00、0xc3
または少なくともいくつかの種類の mov の後に ret (0xc2、0xc3、0xca または 0xcb) が続き、少し下に
MSVC++ は、セキュリティ上の理由からこの種のことを行うのを防ぐための措置を講じていますか、それとも私は愚かなことをしていて、それに気づいていませんか? この方法は、DMC をコンパイラとして使用するとうまくいくようです...
また、逆方向 (バイトの実行) に問題がありますが、根本的な原因は同じであると思われます。
ヘルプやヒントをいただければ幸いです。
assembly - NASM でユーザー入力を取得するにはどうすればよいですか?
プログラムは、ユーザーから単純な文字列を受け取り、それを表示する必要があります。ユーザーからの入力を取得するプログラムを取得しましたが、保存できないようです。これが私がこれまでに持っているものです:
NASM を使用してこれを組み立てています。
assembly - 誰かがこの直接組み立てられたx86JMPオペコードを説明できますか?
学校では、ブートストラッププログラムを使用して、オペレーティングシステムなしでスタンドアロンプログラムを実行しています。私はこのプログラムを研究してきましたが、プロテクトモードを有効にすると、プログラム内でオペコードとオペランドをデータとして直接アセンブルすることで、はるかに大きなジャンプが実行されます。これはGNUアセンブラ用でした:
まず第一に、なぜ(命令ニーモニックの代わりに)これを実行したいのでしょうか?
私はIntelのマニュアルを見てきましたが、それでもコードに少し混乱しています。具体的には、ボリューム2A、3-549ページに、オペコードの表があります。関連するエントリ:
実際のオペコードは明らかですが、最初のバイトである0x66は私を混乱させます。Intelマニュアルの表を参照すると、cpは明らかに6バイトのオペランドが続くことを意味します。そして明らかに次の2行に6バイトが続きます。0x66は、「オペランドサイズのオーバーライドプレフィックス」をエンコードします。これはテーブルのcpと何の関係がありますか?cpには16進値があると思っていましたが、代わりにこのオーバーライドプレフィックスがあります。誰かが私のためにこれを片付けてくれませんか?
これがodからのダンプです:
TARGET_ADDRESSは0x00010000として定義されました。
また、最後の2バイトの重要性にも少し混乱しています。しかし、それはまったく別の質問のようです。かなり遅くなっていて、コードとIntelのマニュアルを何時間も見つめているので、自分の主張が理解できたと思います。
見てくれてありがとう!
assembly - BIOS の下で USB フラッシュ ドライブを使用して低レベル IO を実行する方法 (フロッピーと比較)?
私は最近、フロッピー ドライブで使用するためのブートストラップ コードを研究しています。私の目標は、私の USB フラッシュ ドライブを使用するようにプログラムを変更することです。これで、INT 13H 機能がフロッピー デバイスでどのように使用されたかがわかりますが、私の質問は、USB ドライブとの通信はどのように異なるのでしょうか?
たとえば、フロッピー コード (GNU アセンブラ) の一部を次に示します。
0x80 を %dl に移動すると、BIOS で最初の HDD が選択されることを確認しました。私の特定の BIOS では、USB ドライブを含むドライブの順序を変更できます。これが BIOS に依存するようになっていることは確かですが、BIOS にリストされている順序は、%dl に移動する値に対応している可能性があると考えていました。いくつかのドキュメントを追跡する必要があります...
ブロックデバイスをそのまま使用することに本当に慣れていません。誰かがもっと学び始めるのに適した場所を教えてもらえますか?
ありがとう!