1. 程式人生 > >簡單的雙重for迴圈的彙編解釋

簡單的雙重for迴圈的彙編解釋

#include<stdio.h>
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部分彙編還沒有搞明白。。