問題タブ [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.
assembly - アセンブリのキャリー フラグ、補助フラグ、オーバーフロー フラグ
アセンブリのキャリー フラグ、補助フラグ、オーバーフロー フラグの違いがわかりません。私は現在学校でそれを勉強していますが、先生は詳細には触れませんでした. 理解するのを手伝ってください。試験で必要になります。本当に感謝します!! 私が今知っているように見えることは、データ用に8ビットしかないときに255 + 9を試してみると、キャリーフラグが使用されるということです。補助フラグは同じですが、最後の4ビットのみ?? また、オーバーフローは、2 進数に 7 ビットがあり、8 (左端) が符号に使用される場合に使用されますか???
multithreading - x86 予約済み EFLAGS ビット 1 == 0: これはどうして起こるのでしょうか?
Win32 API を使用して、スレッドの状態を停止/開始/検査/変更しています。一般的にはかなりうまく機能します。時々失敗するので、原因を突き止めようとしています。
次の方法で、他のスレッドでコンテキスト スイッチを強制しているスレッドが 1 つあります。
これは非常にうまく機能します....しかし...ごくまれに、コンテキストスイッチが失敗するようです。(症状: 私のマルチスレッドシステムは、奇妙なレジスターの内容で奇妙な場所を実行して空高く吹き飛ばします)。
コンテキスト制御は、次の方法で実現されます。
print ステートメントは実行されません。Windows は、コンテキスト操作がすべて確実に行われたと考えていると結論付けています。
ああ、そうです、停止中のスレッドが計算中でないとき (たとえば、システム関数内) を知っていて、それを停止/コンテキスト切り替えしようとしません。コンピューティング以外のことを行う各スレッドは、コンピューティング以外のことをしている間、スレッド固有の「私に触れないでください」フラグを設定するため、私はこれを知っています。(デバイス ドライバー プログラマーは、これを「割り込み無効化」命令と同等のものとして認識します)。
そこで、コンテキストブロックの内容の信頼性について疑問に思いました。コンテキスト ブロックから引き出されたさまざまなレジスタ値にさまざまなサニティ テストを追加しました。実際には、ESP が (TIB で定義されたスタック領域の境界内で) OK である、PC が期待するプログラム内またはシステム コール内にあるなどと判断できます。ここで驚くことはありません。
条件コード ビット (EFLAGS) が正しく読み取られていることを確認することにしました。これが間違っていると、状態が復元されたときに、切り替えられたタスクが「間違った分岐」を取る原因になります。そこで、次のコードを追加して、Intel リファレンス マニュアル ( http://en.wikipedia.org/wiki/FLAGS_register )によると、EFLAGS レジスターと称するものに EFLAGS のようにしか見えないものが含まれていることを確認しました。
私の Win 7 AMD Phenom II X6 1090T (hex コア) では、ECX = 0200h のブレークポイントでときどきトラップします。私の Win 7 Intel i7 システムでも同じように失敗します。私が疑ったように、EFLAGSが正しく保存されていないことを示唆していることを除いて、私はこれを無視します。
Intel (および AMD) のリファレンス マニュアルを読んだところによると、ビット 1 は予約されており、値は常に "1" です。私がここで見るものではありません。
明らかに、MS はスレッド ストップで複雑なことを実行してコンテキスト ブロックを埋めます。状態を正確に保存することを期待しています。このビットは正しく保存されていません。このビットを正しく保存しない場合、他に何を保存しないのでしょうか?
このビットの値が時々ゼロになる可能性がある/すべき理由についての説明はありますか?
編集:私のコードは、ブレークポイントをキャッチすると、レジスタとスタックをダンプします。スタック領域には、コンテキスト ブロックがローカル変数として含まれます。EAX と、コンテキスト ブロック内の EFLAGS の適切なオフセットにあるスタック内の値の両方に、値 0244h が含まれています。したがって、コンテキスト ブロックの値は実際には間違っています。
EDIT2:マスクと比較値を次のように変更しました
これは、問題なく確実に実行されるようです。どうやら、Win7 は eflags のビット 1 を正しく処理しておらず、問題ではないようです。
まだ説明に興味がありますが、明らかに、これは私の時折のコンテキストスイッチのクラッシュの原因ではありません。
assembly - imul 命令の ZF の動作は何ですか?
命令セットのリファレンスには、imul 命令の ZF は未定義であると記載されています。では、レジスタの値に 0x0 の即値を掛けると、ZF はどうなるでしょうか?
assembly - CPU のパリティ フラグの目的は何ですか?
一部の CPU (特に x86 CPU) は、ステータス レジスタにパリティ フラグを備えています。このフラグは、演算結果のビット数が奇数か偶数かを示します。
パリティフラグは、プログラミングのコンテキストで実際にどのような目的で使用されますか?
補足: 基本的なエラー チェックを実行するために、パリティ ビットと組み合わせて使用することを意図していると思いますが、そのようなタスクは、CPU フラグ全体を保証することは一般的ではないようです。
assembly - アセンブリ言語の mul コマンドの結果として ZF が設定されない
私はmasm615アセンブラとテキストパッドをエディタとして使用しています。私は32ビットのアセンブリプログラムを書いています。mul
プログラムでは、命令の結果としてゼロフラグを設定しようとしていますが、機能していません。eax
レジスタの結果がゼロであるのにゼロフラグがクリアされる理由を誰か教えてください。次のコードを試しています
assembly - アセンブリ言語で NEG 命令を実行すると、オーバーフロー フラグが設定されます
NEG 命令がオーバーフロー フラグにも影響するかどうかを知りたいです。変数の値を無効にすることは知っていますが、Overflow フラグに影響するかどうかはわかりませんでした。
x86 - アセンブリにゼロ フラグのみを設定し、他のフラグには影響を与えません
アセンブリでゼロフラグを設定する必要がありますが、他のフラグを変更するべきではありません。だから私はpushfを実行することを考えていましたが、それをeaxにポップしましたが、フラグregに新しい値を与える方法がわかりません。私が考えることができるすべて:
ここから、私は何をすべきかわかりません。
assembly - xmmX ベクトルの比較
xmm1 ベクトルに 4 つの単精度浮動小数点 {1.5, 1.5, 1.5, 1.5} をロードし、同じ点を持つ xmm2 をロードすると、xmm1 == xmm2 となります。次に、それらを比較したいので、アセンブリで記述します。
cmpeqpsは eflags を設定しないため、次のように言えます。
ucomissを使用してベクトルの最も右側の部分を比較し、次に右にシフトしてさらに 3 回繰り返す必要があるでしょうか?
ありがとう
assembly - 加算と減算によるキャリー フラグの設定とクリア
キャリーフラグをクリアするのに苦労していましたが、減算を使用してクリアする方法を思いつきましたが、加算と減算を使用してキャリーフラグを設定およびクリアする方法について誰かが私と共有できるより良い方法があるかどうか疑問に思っていました.
これは、キャリーフラグを設定およびクリアする必要があるものです。最初に AL から binNum2 を減算すると、元の FFh の値が返されますが、キャリー フラグは AL から binNum2 を再度減算するまで設定されたままです。次に AL を FEh に設定し、キャリー フラグをクリアします。
誰かがキャリーフラグをクリアするより良い方法を持っていますか?
assembly - ASM8086: mul、imul、キャリーフラグ、オーバーフローフラグ
キャリーフラグとオーバーフローフラグの論理がわかりました。しかし、このプログラム (MASM 8086 で書かれたもの) を読んだとき、私は少し戸惑いました。
プログラムの目的は、二次方程式に 2 つの別個の解があるか、2 つの等しい解があるか、まったく解がないかを判断することです。
さて、私の疑問は次のとおりです。なぜ最初の 3 つのチェックでキャリー フラグがテストされ、最後のチェックでオーバーフロー フラグがテストされたのでしょうか。
最後の例では、2 つの符号付き数値の間で減算を行っているため (これは私たちが考えているように)、オーバーフロー フラグをチェックして、オーバーフローがあるかどうか (つまり、数値が interval を超えているかどうか) を確認する必要があります[-2^15,2^15-1]
。しかし、たとえば最初のものについては、 を(bb)^2
使用しimul
ます。
したがって、それらを 16 ビットの符号付き数値 (so -2^15 <= bb <= 2^15-1
) と見なし、(乗算アルゴリズムで) 少なくとも 1 つの和が / ビットをオンにする場合、乗算は / ビットをオンに設定CF
します。OF
CF
OF
しかし、符号付きの数値を扱うので、オーバーフロー フラグをチェックするべきではありませんか?
また、( )2^15-1=32767
に設定bb
すると; 等しい場合( ) 。190
190^2=36100
CF=0
bb
200
200^2=40000
CF=1
何故ですか?どなたか詳しく説明していただけないでしょうか。
PS: EMU8086 を使用しています。