#includevoid show()
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
乙個簡單的彙編視窗
386 model flat,stdcall option casemap none include windows.inc include user32.inc includelib user32.lib include gdi32.inc includelib gdi32.lib include...
乙個簡單函式的反彙編
void myfunction int a,int b int c a b 1 儲存ebp。ebp總是被我們用來儲存這個函式執行前的esp的值。執行完畢後,我們用ebp恢復esp 同時,呼叫此函式的上層函式也用ebp做同樣的事情。所以先把ebp壓入堆疊,返回之前彈出,避免ebp被我們改動。push ...
迴圈佇列的乙個簡單實現
這是筆試中遇到的一道題,要求實現迴圈佇列,有入隊,出隊,判斷是否為空,是否滿等操作。分析 可以使用乙個陣列來存放迴圈佇列,隊頭標記與隊尾標記初始都為0,入隊操作即隊尾標記加1,若加1後相對迴圈等於隊頭則上溢 出隊操作即隊頭標記加1,若加1後相對迴圈等於隊尾則下溢 若隊頭標記等於隊尾標記則為空 若隊尾...