简单的双重for循环的汇编解释


实验名称:循环结构的汇编编译代码分析

实验要求:用C语言写一段简单的带有双重循环的代码,用GCC编译成汇编。分析汇编代码和程序代码的关系。为每一句汇编写注释,标明它的作用与含义。 


#include
void show()  
{  
    int i,j;
    for(i=0;i<100;i++){
        for(j=2;j<=i;j++){
           if(i%j==0)  break;
        }
        if(j>=i)   printf("%d",i);
    }
}

show:
.LFB24:
	pushl	%ebx             //将%ebx压入栈,%ebx作为变量i的寄存器
	subl	$24, %esp        //栈顶指针减24
	movl	$0, %ebx         //先把i=0存到%ebx寄存器
	jmp	.L2              //无条件,直接跳转到L2

.L4:                             //执行第二个for循环的语句
	movl	%ebx, %eax       //把%ebx(i)复制给 %eax 
	cltd                     //R[%edx]:R[%eax] = 符号位扩展R[%eax],转换为4字节(把%eax符号位扩展到%edx,此时%edx存放的是%ebx(i)的符号位)
	idivl	%ecx             //R[%edx] = R[%edx]:R[%eax] % j; R[%eax] = R[%edx]:R[%eax] / j;(把i%j存放到%edx中,把i/j存放到%eax)
	testl	%edx, %edx       //测试双字,与关系,S1 & S2(判断%edx是否为0,即判断i%j是否为0)
	je	.L3              //相等|零时候跳转(  if(i%j==0)-->L3,if(i%j!=0)执行接下去L8的语句  )

.L8:
	addl	$1, %ecx          //执行j++
	cmpl	%ebx, %ecx        //判断 j <= i
	jle	.L4               //如果不符合  j <= i ,即  j>i ,即该数是素数,就执行接下去L5的输出语句 
	jmp	.L5               //直接跳转到L5

.L9:
	movl	$2, %ecx                //把j=2存放到%ecx
	jmp	.L3                     //直接跳转到L3

.L10:
	movl	$2, %ecx                //把j=2存放到%ecx

.L3:
	cmpl	%ecx, %ebx              //比较i和j 
	jg	.L6                     //如果i>j 跳转到 L6 ,否则执行下面L5

.L5:                                    //printf 代码块,输出素数
	movl	%ebx, 8(%esp)
	movl	$.LC0, 4(%esp)
	movl	$1, (%esp)
	call	__printf_chk

.L6:                        
	addl	$1, %ebx                //执行i++
	cmpl	$100, %ebx              //判断i<100
	je	.L1                     //如果i=100了,就跳到L1

.L2:
	cmpl	$1, %ebx                //比较i和1
	jle	.L9                     //如果i<=1 的话,跳转到 L9,否则执行下面的代码(所以是从i=2开始是直接执行下面的代码)
	movl	%ebx, %eax              //把 %ebx (i) 复制到%eax中
	shrl	$31, %eax               //将 %eax 进行逻辑右移31位(和上面一句联合起来的效果就是将%eax设置为全0)   
	leal	(%ebx,%eax), %edx       //
	andl	$1, %edx                //
	cmpl	%eax, %edx              //判断%eax和%edx是否相等
	je	.L10                    //
	movl	$2, %ecx                //%ecx存放j变量,所以先把j=2存放到%ecx
	jmp	.L8                     //无条件跳转到L8

.L1:                                    //等到i=100时,跳转到这,程序结束
	addl	$24, %esp               //栈顶指针加24
	popl	%ebx                    //将%ebx弹出栈
	ret                             //return


存在问题 : L2部分汇编还没有搞明白。。

你可能感兴趣的:(【深入理解计算机系统】)