学習C++逆アセンブリ-do......whileサイクル
2837 ワード
C++ソースコード:
9以下の場合、
#include<stdio.h>
int main()
{
int nSum=0;
int nIndex=0;
do
{
nSum+=nIndex;
nIndex++;
}while(nIndex<10);
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,-0xc(%ebp)
0x0040130d <main+29>: mov -0xc(%ebp),%eax
0x00401310 <main+32>: call 0x401868 <_alloca>
0x00401315 <main+37>: call 0x4013e8 <__main>
0x0040131a <main+42>: movl $0x0,-0x4(%ebp)
0x00401321 <main+49>: movl $0x0,-0x8(%ebp)
0x00401328 <main+56>: mov -0x8(%ebp),%eax
0x0040132b <main+59>: lea -0x4(%ebp),%edx
0x0040132e <main+62>: add %eax,(%edx)
0x00401330 <main+64>: lea -0x8(%ebp),%eax
0x00401333 <main+67>: incl (%eax)
0x00401335 <main+69>: cmpl $0x9,-0x8(%ebp)
0x00401339 <main+73>: jg 0x40133d <main+77>
0x0040133b <main+75>: jmp 0x401328 <main+56>
0x0040133d <main+77>: mov -0x4(%ebp),%eax
0x00401340 <main+80>: mov %eax,0x4(%esp)
0x00401344 <main+84>: movl $0x403000,(%esp)
0x0040134b <main+91>: call 0x4018c8 <printf>
0x00401350 <main+96>: mov $0x0,%eax
0x00401355 <main+101>: leave
0x00401356 <main+102>: ret
End of assembler dump.
(gdb)
はmain+37から分析を開始する.movl $0x0,-0x4(%ebp)
対応int nSum=0;
movl $0x0,-0x8(%ebp)
対応int nIndex=0;
mov -0x8(%ebp),%eax
nIndexの値をeaxレジスタに入れる.lea -0x4(%ebp),%edx
nSumのアドレスをedxレジスタに入れる.add %eax,(%edx)
対応nSum+=nIndex;
カッコはアドレス対応の値をとることを表し、メモリユニットの値を直接修正し、レジスタで書く必要はありません.lea -0x8(%ebp),%eax
nIndexのアドレスをeaxレジスタに入れる.incl (%eax)
対応nIndex++;
cmpl $0x9,-0x8(%ebp)
対応}while(nIndex<10);
ここでは9と比較し、9より大きい場合はjg 0x40133d <main+77>
ジャンプサイクル;9以下の場合、
jmp 0x401328 <main+56>
はサイクルを継続します.