乙個簡單的雙重for迴圈的彙編語句解釋

2021-07-09 02:23:24 字數 2349 閱讀 3486

#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後相對迴圈等於隊尾則下溢 若隊頭標記等於隊尾標記則為空 若隊尾...