Mingw i wstawka assemblerowa

0

Witam!

Używam Windowsa XP, mam procesor Intel Core Duo, korzystam z Mingw w tandemie z Eclipsem. Moje pytanie dotyczy pewnej wstawki asemblerowej:

asm(
		"RDTSC \n"			//zawartość licznika cykli (64-bit) -> EDX:EAX
		"movl %eax, -4(%ebp) \n"	//EAX -> pierwsza zmienna lokalna (low)
		"movl %edx, -8(%ebp) \n"	//EDX -> druga zmienna lokalna (high)
	);

Wszystko działa pięknie (tj. wstawka zczytuje wartości licznika cykli procesora i przekazuje do zmiennych lokalnych) dopóki kompiluję cały kod w ustawieniu Debug kompilatora (poziom debugowania na maksymalny, poziom optymalizacji na zerowy), problem zaczyna się, gdy gotową aplikację, chciałem przyspieszyć poprzez kompilację w trybie Release (debugowanie na minimum, optymalizacja najmocniejsza). Wtedy ta wstawka nie działa, w zmiennych lokalnych pojawiają się #FFFFFFFF.

Dlaczego tak się dzieje? Jak to naprawić?

0

Bo nie tak się używa wstawek. Nie możesz znać położenia na stosie z poziomu źródła - zależnie od sytuacji dochodzą wyrównania, klamoty kontrolne itd. MinGW /GCC/ ma odpowiednią składnię do przyjmowania i zwracania wartości, będzie to wyglądać mniej\więcej tak:

unsignd long lo, hi;
asm volatile ("rdtsc" : "=d"(hi), "=a"(lo));

Druga sprawa - rdtsc zwraca licznik cykli, ten zaś jest rożny dla każdego procesora\rdzenia - nawet z ustawieniem maski na konkretny procesor i tak do pomiaru czasu się średnio nadaje.

0
asdf napisał(a)

Bo nie tak się używa wstawek. Nie możesz znać położenia na stosie z poziomu źródła - zależnie od sytuacji dochodzą wyrównania, klamoty kontrolne itd. MinGW /GCC/ ma odpowiednią składnię do przyjmowania i zwracania wartości, będzie to wyglądać mniej\więcej tak:

unsignd long lo, hi;
asm volatile ("rdtsc" : "=d"(hi), "=a"(lo));

Wielkie dzięki, to jest to czego potrzebowałem!

asdf napisał(a)

Druga sprawa - rdtsc zwraca licznik cykli, ten zaś jest rożny dla każdego procesora\rdzenia - nawet z ustawieniem maski na konkretny procesor i tak do pomiaru czasu się średnio nadaje.

Doskonale sobie z tego zdaję sprawę, jednak piszę program na zaliczenie, a wykładowca zażyczył sobie, aby mu zliczyć liczbę cykli procesora, więc liczę ;) Jeszcze raz dzięki.

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