2014-05-17 100 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;