2014-05-17 134 views
1

我是彙編語言的新手,我無法處理嵌套的循環語句。 我想如其他語言,如相同的表達式:彙編語言中的嵌套循環

for(i=0;i<10;i++){ 
    for(j=0;j<10;j++){ 
    statements.... 
    } 
} 

我想用匯編語言這種表達。 謝謝...

+1

爲什麼不編譯它並研究生成的機器碼? –

+0

哪一種彙編語言?你的目標是什麼架構? – BonzaiThePenguin

+1

我正在使用x86架構 – Webster

回答

1

這裏有一個簡單的例子,我用C語言編寫的內聯彙編代碼,我在Visual Studio中使用Intel符號進行了測試。我將計入eax,這是用於函數返回值的寄存器,循環的所有迭代(即100)。 ebx持有i計數器,ecx持有j計數器。

時一定要小心使用這些,如果你在線使用它們,ecx用於內部對象this參考,它也使用了muldiv。你可以使用任何你喜歡的寄存器或者甚至是堆棧。我使用xor來重置計數器,因爲xor操作比mov eax,0操作便宜。

#include <stdio.h> 

int countLoops() 
{ 
    _asm 
    { 
     xor eax,eax 
     xor ebx,ebx 
     xor ecx,ecx 


outer_loop : 
     cmp ebx,10 
     je final 
     add ebx,1 

inner_loop: 
     cmp ecx,10 
     je reset_inner_loop 
     add ecx,1 

     add eax,1 

     jmp inner_loop 

reset_inner_loop: 
     xor ecx,ecx 
     jmp outer_loop 

final: 

    }; 
} 

int main(void) 
{ 
    int numOfLoops = countLoops(); 
    printf("%d\n", numOfLoops); 
    return 0; 
} 

此問題也已在here之前回答。

2

讓我們一次一步地解決這個問題。第一步是打破了for到其獨立的部分:

i=0; 
    do { 
     j=0; 
     do { 
      /* statements.... */ 
      j++; 
     } while(j < 10); 
     i++; 
    } while(i < 10); 

while大多隻是一個測試和跳轉:

i=0; 
second: 
    j=0; 
first: 
    /* statements.... */ 
    j++; 
    if(j < 10) 
     goto first; 
    i++; 
    if(i < 10) 
     goto second; 

下,重命名變量,所以他們的名字寄存器:

ebx=0; 
second: 
    ecx=0; 
first: 
    /* statements.... */ 
    ecx++; 
    if(ecx < 10) 
     goto first; 
    ebx++; 
    if(ebx < 10) 
     goto second; 

現在,它是如此接近裝配是微不足道的轉換:

mov ebx,0   ;ebx=0; 
second: 
    mov ecx,0   ;ecx=0; 
first: 
         ;/* statements.... */ 
    inc ecx   ;ecx++; 
    cmp ecx,10   ;if(ecx < 10) 
    jb first   ;goto first; 
    inc ebx   ;ebx++; 
    cmp ebx,10   ;if(ebx < 10) 
    jb second   ;goto second;