問題タブ [eflags]
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.
x86 - ユーザーモードで x86 IA32 Intel CPU の TF フラグを設定/クリアする方法
x86 IA32 Intel CPUのユーザーモードでEFLAGS.TFを設定/クリアする手順を知りたい
TFフラグをクリアするために以下を試しましたが、エラーが発生しました***** Unhandled interrupt vector *****
assembly - 組立:FE+FB
8ビットレジスタで次の演算を行った場合、キャリーフラグ(CF)、オーバーフローフラグ(OF)、サインフラグ(SF)、ゼロフラグ(ZF)は何にセットされるでしょうか?
0xFE + 0xFB
- CF=1、OF=0、SF=1、ZF=0
- CF=1、OF=1、SF=0、ZF=0
- CF=1、OF=0、SF=1、ZF=1
- CF=1、OF=1、SF=1、ZF=0
- 上記のどれでもない。
ありがとう
William Stallings からの演習問題 - コンピュータの組織とアーキテクチャ。
c - Valgrind は RFLAGS レジスタのトラップ フラグ (TF) ビットを無視していますか?
私のプロジェクトの 1 つで、RFLAGS レジスタを手動で編集して、TF ビットを使用して各命令で SIGTRAP を発生させる必要があります。プログラムを直接実行する場合は機能しますが、Valgrind で実行する場合は機能しません。
ここに私が何を意味するかを示す簡単なプログラムがあります:
予想される出力は次のとおりです。
Valgrind の出力は次のとおりです。
assembly - SCAS および MOVS 命令は方向 EFLAG の値によってどのように影響を受けますか?
方向 EFLAG を設定またはクリアすると、SCAS および MOV 命令がレジスタをデクリメントまたはインクリメントする方法がどのように変化するかを知りたいです。私はいくつかのウェブページを読み、以下にリストする次の仮定を立てました.
私は MASM 32 SDK を使用しています。Visual MASM のダウンロードおよびインストール ウィザードを使用してインストールしたバージョンはわかりません。Visual MASM を使用してライトし、MASM32 Editor を使用してそれらをリンクしてオブジェクトと実行可能ファイルにビルドします。Windows 7 Pro 64 ビット OS を使用しています。
SCAS
SCAS 命令は、「AL のバイトまたは AX のワードを、ES の DI が指すバイトまたはワードと比較します」。したがって、SCAS を使用するには、ターゲット文字列アドレスを EDI に移動し、検索する文字列をアキュムレータ レジスタ (EAX およびバリアント) に移動する必要があります。
方向フラグを設定してから SCAS を使用すると、32 ビット システムの使用時に SCAS の実行が停止します。32 ビット システムでは、SCAS に「文字列を最後から最初までスキャンする」ように強制することはできません。
REP 命令は、常に ECX レジスタをカウンターとして使用し、方向フラグの値に関係なく、常に ECX をデクリメントします。つまり、REP SCAS を使用して「文字列を最後から最初までスキャンする」ことは不可能です。
ソース:
SCAS/SCASB/SCASW、Birla Institute of Technology and Science
スキャン文字列、c9xm.me から
SCAS/SCASB/SCASW/SCASD — felixcloutier.com からのスキャン文字列
MASM : 「文字列」命令の使用、www.dreamincode.net から/フォーラム
以下は、質問で参照するプログラムのコードの一部です。
- 「検索」セクションのコードは、文字列 InputEnd を一度に 4 バイト、したがって一度に 4 文字検索します。ブロックは EAX の文字、つまり「省略」という単語をスキャンします。常に edi のメモリ アドレスの値から始まり、SCAS (B、W、D、Q) のサフィックスに基づいてインクリメントされます(MASM : Using 'String ' 手順、dream-in-code.com) .
MOVS
「Move Last Word」セクションを使用して、文字列入力から最後のバイトを取得できます。次に、MOVSW を使用して、方向フラグがクリアされていると仮定して、文字列 Input の最後の 4 バイトだけを InputEnd に移動しました。
Input db 32 dup(?)
ブロックを機能させるには、Input をバイト配列として定義する必要があります。InputEnd の定義方法 ("dd ?, 0" または "db 12 dup(?)") に関係なく、mov および scas 命令の操作 (フラグの設定、レジスタの変更など) は変わりません。SCAS および MOV の増分/減分量は、EDI および ESI に格納されているポインタの定義されたバイトまたはサイズではなく、コマンドのサフィックス/最後の文字に依存します。
文字列の最初から最後まで MOVS 転送を行うことはできません。文字列の長さが必要です。対応するアドレスを EDI および ESI にロードします。文字列の長さを EDI および ESI に格納されているアドレスに追加します。最後に、 を使用して方向フラグを設定し
std
ます。ここでの危険は、送信元または宛先バイトより下のアドレスをターゲットにすることです。EDI と ESI はどちらも MOVS によって減少するか、両方とも増加するため、MOVS を使用して文字列の文字を逆にすることはできません。
ソース (以前に SCAS セクションにリストされたサイトを除く):
https://c9x.me/x86/html/file_module_x86_id_203.html
http://faydoc.tripod.com/cpu/movsd.htm
これらの仮定は正しいですか?サイトの URL の x86 テキストは、Web サイトの情報が間違っていることを示していますか?