2017-06-30 21 views
6
インテル®ソフトウェア開発マニュアルが neg命令については、これを言う

NEG命令はx86ではどのように調整フラグ(AF)を設定しますか?

0に設定CFフラグソースオペランドが0の場合。そうでない場合は1にセットされます。結果に応じて、OF、SF、ZF、AF、およびPFフラグが設定されます。

結果によるとSF、ZF、PFの設定が意味することは明白であり、最小の負の数を無効にしようとするとOFが設定されていることがわかります。しかし、AFについてはどうですか?

neg %eaxnot %eax + add $1, %eaxに置き換えられたように、AFが設定されると考えました。しかし、いいえ。実際のCPUで0x6ffffef5を否定すると、AFを設定しますが、0x9000010aに1を加えてもAFは設定されません。あなたは0

からsubで取得したいものに同一の

答えて

5

negセットすべてのフラグ命令のこのシーケンスはneg %eaxと全く同じ(AFを含む)すべてのフラグを設定します。

xor %ecx, %ecx 
sub %eax, %ecx 

インテルのマニュアルでは実際にこれを指定していますが、neg自体の命令セット参照(ボリューム2)エントリの疑似コードの操作セクションまたはフラグの影響を受けるセクションには記載されていません。

the Description section for negのテキストは、このナゲットを含む:

7.3.2.4比較:

この操作は0

からオペランドを減算し、Volume 1に同等ですサイン変更の指示

[CMPに関する段落]

NEG(否定)命令は、ゼロから符号付き整数オペランドを減算します。

このドキュメントの存在は、直接言及されていないa comment on an earlier duplicate of this questionによって指摘されました。

私は、第1巻に指示を説明するセクションがあることは知らなかった。 Intelが個々の指示について言わなければならないことは、第2巻のinsn set referenceにあるとは限りません。


negは、IntelのCPU上sub命令と同じUOPに内部でデコードするといういくつかの証拠があります。 (例えば、neg [mem]は、ALUオペレーションでロードをマイクロヒューズすることができ、ストアアドレスとストアデータをマイクロヒューズすることもできます。inc [mem]はストアをマイクロヒューズできます。

+1

私はそれを試してみたところ、うまくいくようです。 – tbodt

+0

@tbodt:クール、私の理論をテストしてくれてありがとう。 –

+0

*「negがIntel CPUのサブ命令と同じuopに内部的にデコードするという証拠があります」*興味深い...これは[私が最近疑問を呈した](https://stackoverflow.com/questions/44330079/why- does-intels-compiler-prefer-negadd-over-sub)はさらに驚くべきことです。 'neg'が' sub'として内部的にデコードされた場合、 'sub'を介して' neg' + 'add'に利益がもたらされる可能性はありません。おそらく私はこれをバグとして正式に報告するべきです。インテルには問題追跡ツールがありますか? –

関連する問題