学习C++反汇编-do……while循环

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>
继续循环。

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