学习C++反汇编-for循环

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都是一样的。


你可能感兴趣的:(学习C++反汇编-for循环)