問題タブ [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.
go - x64 アセンブリと CMOVLMI: このオペコードはどこに記述されていますか?
Go のソース コードを読んでいるときfastrand()
に、自分のマシンのファイルにある関数を読んでいるときに、次のasm_amd64.s
スニペットに出くわしました。
私の人生では、何CMOVLMI
をすべきか理解できません。それを検索すると、Go だけがそれについて何かを知っているように見えることがわかります。CMOVxx
AMD X86_64 リファレンスで定義されている多くのオペコードを見つけることができ、ウィキペディアのページには条件付き移動命令の長い歴史がありますが、これはそのリストのどこにも表示されません。
CMOVLMI はどこで定義されていますか? Go の内部アセンブラに固有のものですか?
assembly - x86で乗算を計算するためにキャリーフラグとオーバーフローフラグがどのように使用されていますか
乗算された 2 つの数値がレジスタをオーバーフローしたときに、答えを正しく計算するために 2 つのフラグはどのように使用されますか?
たとえば、al
が保持され、0xff
が乗算され0x2
、 へのオーバーフローが発生したax
場合、フラグはこれにどのように役立つのでしょうか?
assembly - x86 アセンブリ - CMP がゼロ フラグを正しく設定しない
デバッグ中にこの比較に出くわしました:
私はそれにブレークポイントを設定し、これを見ました(hexの値):
したがって、ECX と BL が指すバイトが等しいため、この比較を実行した後にゼロ フラグが設定されると予想していました。ただし、代わりに発生したのは、オーバーフロー フラグが設定され、ZF は 0 のままでした。比較後:
なぜこのように振る舞うのですか?符号付き/符号なし整数と関係がありますか? 私は、CMP は不可知論的だと思っていました。つまり、比較の結果を符号付き/符号なしとして解釈することは、次の分岐命令 (たとえば、JG と JA) が行うことでした。比較の後に JNE が続きます。これは、ZF=0 であるために取得され、誤った結果を引き起こしています。
windows - Windows 64 ビット呼び出し規約
Windows関数の呼び出しで見つけることができるドキュメントによると、以下が適用されます:-
Microsoft x64 呼び出し規則 [12][13] は、Windows およびプリブート UEFI (x86-64 でのロング モード用) に準拠しています。最初の 4 つの整数またはポインター引数にレジスター RCX、RDX、R8、R9 を (この順序で) 使用し、追加の引数を (右から左に) スタックにプッシュします。整数の戻り値 (x86 と同様) は、64 ビット以下の場合、RAX で返されます。
Microsoft x64 呼び出し規約では、関数を呼び出す直前にスタックに 32 バイトの "シャドウ スペース" を割り当て (実際に使用されるパラメーターの数に関係なく)、呼び出し後にスタックをポップするのは呼び出し元の責任です。シャドウ スペースは、RCX、RDX、R8、および R9 をスピルするために使用されますが、[14] すべての関数で使用できるようにする必要があります。
レジスタ RAX、RCX、RDX、R8、R9、R10、R11 は揮発性 (呼び出し元保存) と見なされます [15]。
レジスタ RBX、RBP、RDI、RSI、RSP、R12、R13、R14、および R15 は、不揮発性 (callee-saved) と見なされます。[15]
GetEnvironmentVariableA
そのため、特定の状況でへの呼び出しが失敗するまで、kernel32 を喜んで呼び出していました。DF
最終的に、方向フラグが設定されていて、それをクリアする必要があるという事実にたどり着きました。
私は今までこれについての言及を見つけることができず、電話の前に常にそれをクリアするのが賢明かどうか疑問に思いました.
あるいは、他の問題を引き起こす可能性があります。この場合の呼び出しの規則を知っている人はいますか?
assembly - 「AND AL,0xFF」の目的は何ですか?
逆アセンブルされた win32 C++ プログラムを読んでいると、かなりの数が表示されます。
これは完全に無意味ですか、それともコンパイラがこれらを生成するのはなぜですか?
より長い例を次に示します。
これらの操作の後にフラグがチェックされていないため、それは目的ではありません。の後、、、およびAND
の値が に移動されます。AL
CL
DL
[ESI + n]
assembly - 関数またはサブルーチンでDFを保持するためのより良い方法はありますか
私はアルゴリズムの流れについて考えることによって、主に空間のコンテキストで最適化に手を出すのが好きです。いくつかの異なるシナリオを試した結果、これが私が考えた中で最高のシナリオのようです。また、このプロシージャが呼び出されると、DF が設定される場合と設定されない場合があるため、これは必須であると仮定します。
目的: DF を変更せずに発信者に返します。
STD
実際に本体の一部になるものを除いて、このプロローグ/エピローグから目的へのアドレスは 18 バイトで入ります。
これよりもタイトなメソッドを実装した人はいますか?