学習C++逆アセンブリ-forサイクル
2982 ワード
C++ソースコード:
生成されたアセンブリコード:
main+37から分析を開始します.
nIndex=0に対応して、初期化カウンタ変数を表します.
nIndex<=nCountに対応し、サイクル条件比較を示す.
一致しない場合はループから飛び出します.
nSum+=nIndexに対応し、ループ文ブロックを表す.
nIndex++に対応して、ステップ長の設定操作を示します.
以上の分析からforサイクルの流れがわかります.
カウンタ変数、ループ条件比較、ループ文ブロックを初期化し、ステップ長操作を設定し、ループ条件比較に戻ります.したがってforループでは,ステップ長操作をi++と書くか++iと書くかを設定するのは同じである.
#include<stdio.h>
int main()
{
int nSum=0;
int nIndex=0;
int nCount=10;
for(nIndex=0;nIndex<=nCount;nIndex++)
{
nSum+=nIndex;
}
printf("%d
",nSum);
}
生成されたアセンブリコード:
Dump of assembler code for function main:
0x004012f0 <main+0>: push %ebp
0x004012f1 <main+1>: mov %esp,%ebp
0x004012f3 <main+3>: sub $0x18,%esp
0x004012f6 <main+6>: and $0xfffffff0,%esp
0x004012f9 <main+9>: mov $0x0,%eax
0x004012fe <main+14>: add $0xf,%eax
0x00401301 <main+17>: add $0xf,%eax
0x00401304 <main+20>: shr $0x4,%eax
0x00401307 <main+23>: shl $0x4,%eax
0x0040130a <main+26>: mov %eax,-0x10(%ebp)
0x0040130d <main+29>: mov -0x10(%ebp),%eax
0x00401310 <main+32>: call 0x401878 <_alloca>
0x00401315 <main+37>: call 0x4013f8 <__main>
0x0040131a <main+42>: movl $0x0,-0x4(%ebp)
0x00401321 <main+49>: movl $0x0,-0x8(%ebp)
0x00401328 <main+56>: movl $0xa,-0xc(%ebp)
0x0040132f <main+63>: movl $0x0,-0x8(%ebp)
0x00401336 <main+70>: mov -0x8(%ebp),%eax
0x00401339 <main+73>: cmp -0xc(%ebp),%eax
0x0040133c <main+76>: jg 0x40134d <main+93>
0x0040133e <main+78>: mov -0x8(%ebp),%eax
0x00401341 <main+81>: lea -0x4(%ebp),%edx
0x00401344 <main+84>: add %eax,(%edx)
0x00401346 <main+86>: lea -0x8(%ebp),%eax
0x00401349 <main+89>: incl (%eax)
0x0040134b <main+91>: jmp 0x401336 <main+70>
0x0040134d <main+93>: mov -0x4(%ebp),%eax
0x00401350 <main+96>: mov %eax,0x4(%esp)
0x00401354 <main+100>: movl $0x403000,(%esp)
0x0040135b <main+107>: call 0x4018d8 <printf>
0x00401360 <main+112>: mov $0x0,%eax
0x00401365 <main+117>: leave
0x00401366 <main+118>: ret
End of assembler dump.
(gdb)
main+37から分析を開始します.
movl $0x0,-0x4(%ebp)
movl $0x0,-0x8(%ebp)
movl $0xa,-0xc(%ebp)
対応int nSum=0;
int nIndex=0;
int nCount=10;
movl $0x0,-0x8(%ebp)
nIndex=0に対応して、初期化カウンタ変数を表します.
mov -0x8(%ebp),%eax
cmp -0xc(%ebp),%eax
nIndex<=nCountに対応し、サイクル条件比較を示す.
jg 0x40134d <main+93>
一致しない場合はループから飛び出します.
mov -0x8(%ebp),%eax
lea -0x4(%ebp),%edx
add %eax,(%edx)
nSum+=nIndexに対応し、ループ文ブロックを表す.
lea -0x8(%ebp),%eax
incl (%eax)
nIndex++に対応して、ステップ長の設定操作を示します.
jmp 0x401336 <main+70>
設定が完了したら、サイクル条件比較にジャンプします.以上の分析からforサイクルの流れがわかります.
カウンタ変数、ループ条件比較、ループ文ブロックを初期化し、ステップ長操作を設定し、ループ条件比較に戻ります.したがってforループでは,ステップ長操作をi++と書くか++iと書くかを設定するのは同じである.