Article View: pl.comp.lang.asm
Article #2209Re: Nie zagadka, tylko pytanie
From: Andrzej Grażyński
Date: Fri, 16 Apr 2010 11:41
Date: Fri, 16 Apr 2010 11:41
73 lines
3015 bytes
3015 bytes
Bernard pisze: > On 2010-04-16 00:23, Andrzej Grażyński wrote: >> >> Jaki proponujecie sposób sprawdzenia, czy progam chodzi na Pentium czy >> na starszym badziewiu? >> [CIACH] > > Najpierw sprawdzamy, czy procesor ma CPUID (bit w EFLAGS). Jeśli ma - > dalej jest prosto. Jeśli nie ma - może to być najwyżej 486 i TSC nie ma > na pewno. Dziękuję, ten test już znam. > Istnieje cała masa testów umożliwających stwierdzenie typu <= 486 na > podstawie zachowań procesora przy wykonaniu instrukcji. To też jest powszechnie znane, choć teraz nie jest mi potrzebne. > Niezależnie od TSC istnieje jeszcze timer systemowy i zmienna timera > (zlicza interwały ok. 55 ms) w pamięci, dostępna dla apikacji DOSowych. Oczywiście, i gdy nie było RDTSC to był jednyn ysposob odmierzania czasu, choć mało dokładny. W Turbo Pascalu zaimplementowano programowo dokładniejszy zegarek: kręci się pewną wzorcową pętlę, zlicza jej obroty mięzy kolejnymi tylknięciami zegara pod adresem BIOS:$6C, a potem przelicza jedną milisekundę na liczbę obrotó tej pętli. To było dobre jeszcze dla 386, ale teraz jest dość zawodne, bo: 1. W systemie wieloprogramowym pętla kręci się tylko wtedy, gdy zadanie ma przydzielony czas procesora 2. W nowszych procesorach czas jednego obrotu pętli może być zróżnicowany, ze względu na mechanizmy optymalizacyjne (cacheowanie, potok rozkazów). W efekcie Delay(1000) nie zawsze daje jedną sekundę oczekiwania. Te mankamenty znikną, jeśli zamiast programowej pętli użyjemy RDTSC: 1. czekamy, aż zmieni się wartość zegara BIOS:$6C 2. Odczytujemy RDTSC i zapisujemy do TSCSTART 3. czekamy, aż zmieni się wartość zegara BIOS:$6C 4. Odczytujemy RDTSC i zapisujemy do TSCSEND 5. Obliczamy liczbę tyknięć TSC na milisekundę: TSCPERMSEC = (TSCEND-TSCSTART)*(1193180/65536/1000) i odtąd możemy odmierzać interwały w czasie rzeczywistym. Delay(MSec:Word): TSCCOUNT := MSec * TSCPERMSEC; TSC <- RDTSC TSCEND <- TSC + TSCCOUNT-1 repeat TSC <- RDTSC until TSC >= TSCEND;
Technical Details
Message-ID:
<hq9iem$gp7$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mailReferences:
<hq83lv$5in$1@news.onet.pl> <hq8uv7$vas$1@newsread1.aster.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail From: Andrzej Grażyński <grazynsk@petex.com.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Nie zagadka, tylko pytanie Date: Fri, 16 Apr 2010 13:41:54 +0200 Organization: http://onet.pl Lines: 96 Message-ID: <hq9iem$gp7$1@news.onet.pl> References: <hq83lv$5in$1@news.onet.pl> <hq8uv7$vas$1@newsread1.aster.pl> NNTP-Posting-Host: public-gprs74644.centertel.pl Mime-Version: 1.0 X-Trace: news.onet.pl 1271418144 17191 91.94.164.222 (16 Apr 2010 11:42:24 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Fri, 16 Apr 2010 11:42:24 +0000 (UTC) User-Agent: Thunderbird 2.0.0.24 (Windows/20100228) In-Reply-To: <hq8uv7$vas$1@newsread1.aster.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit