C で書いた逆アセンブルされた 32 ビット プログラムを分析しているところです。逆アセンブラからの出力の一部を次に示します。
41153c 02 00 add al, [eax]
41153e 00 00 add [eax], al
411540 44 inc esp
411541 15 41 00 F8 FF adc eax, 0xfff80041 ; "A"
411546 FF invalid
ADC命令を理解しようとしています。Intel開発者マニュアルとx86 ASMに関するさまざまな記事の両方で読んだことから、オペコード0x15は宛先としてEAXを使用するADC命令であり、オペコードに続くのは、キャリー付き加算で使用するメモリアドレス。
ただし、次のバイト (0xFF) が無効としてマークされている理由については少しわかりません。
私はアセンブラにまったく慣れていませんが、これはキャリーフラグと関係があり、値を拡張するために署名する可能性があると想定しています。
私は 2 つの別々の逆アセンブラを使用してコードを調べました。1 つは無効としてマークし、もう 1 つは単純に無視します。
誰かがアドバイスを提供できれば、私はそれを感謝します.
ありがとう
アップデート
他に 2 つの ADC 操作があり、そのうちの 1 つには余分な「無効な」バイトがないため、この投稿にもう少し情報を追加します。
411547 FF 04 00 inc [eax+eax]
41154a 00 00 add [eax], al
41154c 61 popa
41154d 15 41 00 EC FF adc eax, 0xffec0041 ; "A"
411552 FF invalid
411553 FF 04 00 inc [eax+eax]
411556 00 00 add [eax], al
411558 5C pop esp
411559 15 41 00 74 65 adc eax, 0x65740041 ; "A"
41155e 73 74 jnc 0x4115d4 ↓
実行中の 2 番目の ADC にも余分な 0xff '無効' バイトがありますが、3 番目にはありません。
私が見る限り、3 つの ADC 操作すべての唯一の違いは、最初の 2 つが 0xff で始まり、余分な「無効な」バイトがあるのに対し、3 つ目はそうでないことです。これは、余分なバイトが必要かどうかを示す何らかのフラグを形成していると思います。