簡單的雙重for迴圈的彙編解釋
阿新 • • 發佈:2019-02-04
存在問題 : L2部分彙編還沒有搞明白。。#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