Почему мои вложенные циклы for в сборке приводят к бесконечному циклу

Моя программа написана на 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;
}

Почему это приводит к бесконечному циклу?

-1

Решение

Есть как минимум две вещи, которые нужно исправить:

  • Когда вы звоните output() гарантированно не удаляются только следующие регистры:

    • edi, esi, ebx, а также ebp

    В частности, вы используете ecx, которой функция разрешена в корзину.

  • Вы никогда не сбрасываете counter2 до 0, поэтому внутренний цикл не эквивалентен вашему C-коду.

2

Другие решения

Я полагаю, что ответ здесь заключается в том, что вы никогда не сохраняете свои регистры до вызова функций Output а также MakeSpace, Стандартный заголовок функции ничего не гарантирует о ecx или же ebx регистры, используемые в вашем asm код.

0

По вопросам рекламы [email protected]