私は次の一連の記事を読んでいます: http://www.altdevblogaday.com/2011/11/09/a-low-level-curriculum-for-c-and-c
表示されている逆アセンブル コードと、同じコードを実行しているときに作成した逆アセンブル コードはかなり異なり、違いを説明する理解がありません。
行ごとにステップスルーして、各ステップで何をしているのかを説明できる人はいますか? 私が行った検索から、最初の数行はフレームポインターと関係があるように感じます。また、逆アセンブルされたコードには、新しい値を配置する前にレジスターが空であることを保証する余分な行がいくつかあるようです (不在)記事のコードから)
XCode 4 内から g++ コンパイラを使用して、OSX (元の作成者は Windows を使用) でこれを実行しています。これらの差異が OS やアーキテクチャ (32 ビットと 64 ビットの違い) によるものであるかどうかについては、私にはまったくわかりません。またはコンパイラ自体。それは私が推測するコードである可能性さえあります-私のものはメイン関数宣言内にラップされていますが、元のコードはこれについて言及していません。
私のコード:
int main(int argc, const char * argv[])
{
int x = 1;
int y = 2;
int z = 0;
z = x + y;
}
私の逆アセンブルコード:
0x100000f40: pushq %rbp
0x100000f41: movq %rsp, %rbp
0x100000f44: movl $0, %eax
0x100000f49: movl %edi, -4(%rbp)
0x100000f4c: movq %rsi, -16(%rbp)
0x100000f50: movl $1, -20(%rbp)
0x100000f57: movl $2, -24(%rbp)
0x100000f5e: movl $0, -28(%rbp)
0x100000f65: movl -20(%rbp), %edi
0x100000f68: addl -24(%rbp), %edi
0x100000f6b: movl %edi, -28(%rbp)
0x100000f6e: popq %rbp
0x100000f6f: ret
元の記事から逆アセンブルされたコード:
mov dword ptr [ebp-8],1
mov dword ptr [ebp-14h],2
mov dword ptr [ebp-20h],0
mov eax, dword ptr [ebp-8]
add eax, dword ptr [ebp-14h]
mov dword ptr [ebp-20h],eax
行ごとの完全な内訳は非常に啓発的ですが、これを理解するための助けをいただければ幸いです。