汇编语言中的嵌套循环

时间:2014-05-17 16:32:19

标签: assembly for-loop nested-loops

我是汇编语言的新手,我无法处理嵌套的循环语句。 我希望在其他语言中使用相同的表达式,例如:

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

我想用汇编语言表达这个表达式。 感谢...

2 个答案:

答案 0 :(得分:3)

让我们一步一步地解决这个问题。第一步是将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;

答案 1 :(得分: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之前也回答了这个问题。