私は、書く方法と理解する方法、そしてツールと関連ツールを効果的x86 Assembly
に使用する方法を学ぼうとしています。GDB
これを行うために、私はDDD
のフロントエンドとして使用していGDB
ます。
すべて同じレジスタに格納されているように見える条件フラグ(eflags?)が何であるかを理解するのに苦労しています。レジスタ、アセンブリコード、および関連するCコードを投稿します。助けてくれてありがとう。
指定されたブレークポイントで、レジスタは次のように表示されます。0x293 [CF AF SF IF]
以下は実行中のCコードです。(これは私のコーディングスタイルの例ではありません。GCCにcompl
操作を強制的に使用させようとしています。)
int main( int argc, char* argv[] )
{
int a = 0;
int b = 2;
if( a == b ) // There is a breakpoint here!
goto EQUAL;
else
goto NEQUAL;
EQUAL:
return 3;
NEQUAL:
return 1;
}
以下は、私のマシンがそれを分解したアセンブリです。
Dump of assembler code for function main:
0x0000000000400474 <+0>: push %rbp
0x0000000000400475 <+1>: mov %rsp,%rbp
0x0000000000400478 <+4>: mov %edi,-0x14(%rbp)
0x000000000040047b <+7>: mov %rsi,-0x20(%rbp)
0x000000000040047f <+11>: movl $0x0,-0x8(%rbp)
0x0000000000400486 <+18>: movl $0x2,-0x4(%rbp)
0x000000000040048d <+25>: mov -0x8(%rbp),%eax
0x0000000000400490 <+28>: cmp -0x4(%rbp),%eax
0x0000000000400493 <+31>: jne 0x40049d <main+41> # Break point here
0x0000000000400495 <+33>: nop
0x0000000000400496 <+34>: mov $0x3,%eax
0x000000000040049b <+39>: jmp 0x4004a3 <main+47>
0x000000000040049d <+41>: nop
0x000000000040049e <+42>: mov $0x1,%eax
0x00000000004004a3 <+47>: leaveq
0x00000000004004a4 <+48>: retq
End of assembler dump.