Pętla w assemblerze za pomoca loop

0

Program ma za zadanie wykonać proste obliczenie w pętli coś na styl tego (wynik = wynik + i)
Jakoś nie mogę zrozumieć, że nie używamy zmiennej, która robiła by za "licznik w pętli" .
Po co dekrementujemy ilość obiegów przed wejściem do pętli ?
Dlaczego uzywamy tutaj instrukcji xor eax,eax a nie naprzykład mov eax,0 .
Troche inne pytanie add eax,[ebx +4*ecs-4] co oznacza zapis w nawiasach [] ? Czy to jest jakby wskaznik tak jak w c++ ?

int zad63()
{
	int N, suma;
	cout << "Podaj N : "; cin >> N;
	__asm {
		xor eax, eax;//  Czyscimy.
		mov ecx,N; // ilość obiegów
		dec ecx; // Zmnniejszamy ecx po co?
	skok1:
		add eax, ecx;
		loop skok1;    // zmneijsze ecx o 1 i skacze pod dana etykiete  .
		mov suma, eax;
	}
	return suma;
}
int _tmain(int argc,_TCHAR* argv[])
{
	
	cout << zad63();
	system("pause");
    return 0;
}

 
1

Jakoś nie mogę zrozumieć, że nie używamy zmiennej, która robiła by za "licznik w pętli" .

Licznik jest. Rejestr ecx jest używany jako licznik, tylko instrukcja loop używa go w domyśle. Sama dba o dekrementację wartości i sprawdzenie, czy już należy wyjść z pętli.

Dlaczego używamy tutaj instrukcji

xor eax,eax

a nie na przykład mov eax,0

 .

Jest to po prostu szybsze. Moduł ALU w procesorze, a w szczególności instrukcje bitowe są dużo szybsze, niż odwołania do pamięci. Poza tym ta instrukcja zajmuje mniej miejsca. Do zakodowania 
```asm
xor eax, eax

wystarczą dwa bajty (31 C0). Natomiast, aby zakodować mov eax, 0

 potrzeba ich aż czterech (B8 00 00 00 00). Warto wspomnieć, że kod wygenerowany przez kompilator prawie nigdy nie będzie zawierał drugiej wersji.


> co oznacza zapis w nawiasach  [] ?

Wartość w nawiasach jest adresem w pamięci, z którego mają być pobrane dane. Można tam podać proste wyrażenia matematyczne, ale **nie wszystkie** da się zakodować, więc jeżeli kompilator powie ci, że się nie da, to znaczy, że podałeś takie, którego się nie da. :) Dokładnie masz to opisane w 1 tomie dokumentacji intela w sekcji "3.7.5 Specifying an Offset".

1 użytkowników online, w tym zalogowanych: 0, gości: 1