3

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 つ目はそうでないことです。これは、余分なバイトが必要かどうかを示す何らかのフラグを形成していると思います。

4

1 に答える 1

3

これはコードではありません。データを分解しようとしています。

4 にアラインされたバイトを並べ替えると、ある程度理解できます。

411548: 04 00 00 00  ; integer 4
41154C: 61 15 41 00  ; address 0x411561
411550: EC FF FF FF  ; integer 0xFFFFFFEC (-20)
411554: 04 00 00 00  ; integer 4
411558: 5C 15 41 00  ; address 0x41155C
41155C: 74 65 73 74  ; string 'test'
于 2013-09-17T10:47:15.920 に答える