C++源代码:
#include<stdio.h> int main() { int nSum=0; int nIndex=0; int nCount=10; for(nIndex=0;nIndex<=nCount;nIndex++) { nSum+=nIndex; } 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,-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都是一样的。