Wpis z mikrobloga

#programowanie #assembler #assembly #asm #masm

Mam pytanie dot. RDTSC.

CPUID // wmusza zakończenie poprzednich (serializuje)
RDTSC // odczytuje liczbe cykli
MOV ECX,EAX // przechowuje w ECX
CALL Func
RDTSC // po wywołaniu odczytuje kolejny raz licznik
SUB EAX,ECX // różnica powinna dać ile cykli potrzebuje na wykonanie Func

Powyższy kod wykonuje kilkukrotnie. Pierwszy wynik jest zawyżony co wynika z dokumentacji, a potem mam bardzo zbliżone wyniki i tu moje pytanie:

1. Czy te minimalne różnice wynikają z tego że rdzenie procesora mają niezsynchronizowany licznik taktów?
2. Czy przy drugim użyciu RDTSC mam w ogóle pewność, że moja procedura się zakończy przed tym odczytem?

I jeszcze jedno pytanie dot. listingu:
Próbuję za pomocą listingu zweryfikować czy kod wyżej poprawnie liczy liczbę cykli procesora potrzebną na wykonanie procedury, ale nie wiem co dokładnie oznacza litera 'm' przy liczbie cykli.

Z dokumentacji mam: "Meaning: Add cycles depending on next executed instruction." Wtedy mając przykładowo 7m w listingu kiedy mam to 7 taktów uwzględnić w obliczeniach a kiedy nie?

Jeżeli ktoś potrafi odpowiedzieć na choć jedno pytanie to będę wdzięczny.
  • 4
  • Odpowiedz
@ManOfGlass: func nie zmienia ECX nie?
różnice mogą być z takich powodów:
jesteś nie sam więc dolicz czas przełączania kontekstu
możesz odczytywać z różnych pamięci (wolny DRAM i szybki SRAM)

ale że moja odpowiedź jest troszkę "z dupy" bo nie jestem pewien tego co piszę a jedynie przypuszczam. prosił bym zawołać jak ktoś ogarnięty odpowie. lub co było by fajniejsze, może na stacku zapytaj też
  • Odpowiedz