C++源代码:
#include<stdio.h> int main() { int nSum=0; int nIndex=0; do { nSum+=nIndex; nIndex++; }while(nIndex<10); printf("%d\n",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>继续循环。