为什么我在程序集中的嵌套 for 循环会导致无限循环

Why do my nested for loops in assembly result in an infinite loop

本文关键字:循环 for 无限循环 嵌套 程序 程序集 集中 为什么      更新时间:2023-10-16

我的程序是用C++编写的,其中嵌入了一些x86汇编语言。我有 2 个嵌套的汇编语言 for 循环,我必须通过。但是,当我编译程序时,我得到了一个无限循环。C++中的等效程序如下所示:

#include<iostream>
using namespace std;
int main()
{
    int a[4] = {3,6,4,7};
    for(int k = 0 ; k < 4;k++)
    {
        for(int l = 0 ; l < a[k];l++)
        {
            cout<<'*';
        }
        cout<<endl;
    }
    system("pause");
    return 0;
}
 /*
  *** 
  ******
  ****
  *******
  Press any key to continue . . .
  */

这是同一件事,但混入了组装。

#include<iostream>
using namespace std;
void output(); //function for making an '*'
void makeSpace(); //function for making a space
int main()
{
    int a[4]={3,6,4,7};
    int counter = 0; //counter that will be used for first forloop
    int counter2 = 0; // counter to be used for second forloop
_asm{
    mov ebx,0 // this is to move from element 0,1,2,3,4, through the array
    mov ecx,0 // ecx will get the data from the array, only to be used as a
              // counter in forloop2 though.
     for1:
    cmp counter,4 //begins for firloop
    je starts 
    mov ecx,[a+ebx] // move the 0th element from array to ecx
    add ebx,4// ebx = ebx+4, I'm doing this to advance the array position (int)
    inc counter// increment counter by one
      for2:
    cmp counter2,ecx //begin forloop2, 
    je starts2
    call output
    inc counter2 //increment counter2 by one
    jmp for2 
      starts2:
    call makeSpace
    jmp for1
      starts:
}
    return 0;
}
void output()
{
    cout<<'*';
    }
void makeSpace()
{
    cout<<endl;
}

为什么这会导致无限循环?

您至少需要解决两件事:

  • 调用output()时,只能保证以下寄存器不会被丢弃:

    • ediesiebxebp

    特别是,您正在使用ecx,允许该函数将其丢弃。

  • 永远不会将counter2重置为 0,因此内部循环不等同于 C 代码。

我相信

这里的答案是,在调用函数OutputMakeSpace之前,您永远不会保留寄存器。 标准函数标头不保证有关asm代码中使用的ecxebx寄存器的任何信息。