Family: UInt4;Model: UInt4;Stepping: UInt4;Features: TCpuFeatureSet;Vendor: string[12];end;// Pobranie informacji o CPU i zapisanie...
Serwis znalezionych hasełOdnośniki
- Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
- aparaty cyfrowe Rodzaj pamięci to informacja na temat tego na jakich kartach pamięci aparat zapisuje zdjęcia...
- przekazywaniu właściwym adresatom we właściwym czasie informacji, które zostaną zrozumiane zgodnie z intencją nadawcy;zdolności do właściwego odbioru...
- Już samo podanie w polskiej telewizji publicznej informacji o wyrażeniu przez kogoś krytycznej opinii o wspomnianym festiwalu (firmowanym wszak przez TVP) było...
- Na obudowie modułu znajduje się osiem diod informujących o stanie modułu, pracy serwonapędów i komunikacji z nimi, port RS232 służący do aktualizacji...
- Kosmonauci informowali:- Zdumiewa twardy sen mieszkańców miasta, nie reagują zupełnie na światła lamp, przy pomocy których odnajdujemy drogę w labiryncie...
- W 2002 roku jedno z głównych źródeł informacji medycznych, „The New England Journal ofMedicine”, opublikowało artykuł pod tytułem Migraine - Current...
- Protokół informacyjny strefy odpowiedzialny jest także za współpracę z protokołem RT MP w uaktualnianiu tablicy ZIT...
- - Jakie będzie zatem twoje następne posunięcie?- Myślę, że w celu uzyskania pozostałych informacji posłużę się numerami ubezpieczeń społecznych -...
- W końcu mężczyzna zaczął przekazywać nowe informacje - powtarzając przemowę, którą Tremane rzekomo wygłosił do swych oddziałów, wymierzoną...
- niezwłocznie dawał o tym znać skinieniem głowy, jeśli nie udało mu się uchwycić jego sensu - informował o tym fakcie potrząsając głową...
Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
function GetCpuID(var Cpuid: TCpuId): Boolean;
implementation
function GetCpuID(var Cpuid: TCpuId): Boolean;
asm
// Sprawdzenie, czy procesor obsługuje instrukcję CPUID
// Test zmienia wartości rejestrów EXC i EDX.
pushfd
"
pop ecx // Załadowanie EFLAGS do ECX
mov edx, ecx // Utworzenie kopii EFLAGS w EDX
xor ecx, $200000 // Ustawienie znacznika ID
push ecx // Próba ustawienia EFLAGS
popfd
pushfd // Sprawdzenie, czy zmiana została zachowana
pop ecx // Pobranie nowej wartości EFLAGS do ECX
xor ecx, edx // Porównanie z EDX
je @NoCpuID // Jeżeli bity są sobie równe, procesor
// nie posiada instrukcji CPUID
// Rozkaz CPUID istnieje. Odtworzenie oryginalnej wartości EFLAGS
push edx
popfd
// Rozkaz CPUID zniszczy zawartość EAX, dlatego argument Cpuid
// zachowany zostanie w ESI. Delphi wymaga rejestru ESI w chwili
// zakończenia bloku ASM, dlatego niezbędne jest zapamiętanie jego
// oryginalnej wartości.
// Zapamiętywana jest również wartość EBX, którą zniszczy CPUID,
// a która musi być zachowana.
push esi
push ebx
mov esi, eax
// Pobranie nazwy producenta, będącej złączeniem zawartości
// rejestrów EBX, EDX i EAX, traktowanych jako 4-bajtowe tablice
// znaków.
xor eax, eax
dw $a20f // CPUID instruction
mov BYTE(TCpuid(esi).Vendor), 12 // string length
mov DWORD(TCpuid(esi).Vendor+1), ebx // string content
mov [OFFSET(TCpuid(esi).Vendor)+5], edx
mov [OFFSET(TCpuid(esi).Vendor)+9], ecx
// Pobranie informacji o procesorze
dw $a20f // rozkaz CPUID
mov TCpuid(esi).Features, edx
// Sygnatura procesora dzieli się na cztery części, z których
// większość ma długość 4 bitów. Delphi nie posiada pól bitowych,
// dlatego rekord TCpuid
// używa bajtów do zapisywania tych pól. Oznacza to konieczność
// pakowania czwórek bitów (ang. nibble) w bajtach.
mov edx, eax
and al, $F
mov TCpuid(esi).Stepping, al
shr edx, 4
mov eax, edx
and al, $F
mov TCpuid(esi).Model, al
shr edx, 4
mov eax, edx
and al, $F
mov TCpuid(esi).Family, al
shr edx, 4
mov eax, edx
and al, $3
mov TCpuid(esi).CpuType, al
pop ebx // odtworzenie rejestrów EBX i ESI
pop esi
mov al, 1 // Zwrócenie wartości prawdziwej
ret
@NoCpuId:
xor eax, eax // Zwrócenie fałszu jako oznaki braku instrukcji
// CPUID
end;
end.
,
CDecl, Pascal, Register, SafeCall, StdCall
Nagłówek procedury; assembler;
Dyrektywa assembler nie ma żadnego znaczenia. Istnieje dla zachowania zgodności z Delphi 1.
Asm
procedure Assert(Test : Boolean [; const Message: string]);
Procedura Assert ma za zadanie dokumentować i wymuszać pewne założenia, jakie programista robi podczas pisania kodu. Assert nie jest prawdziwą procedurą. Kompilator traktuje jej wywo-
łanie w sposób specjalny, kompilując nazwę pliku i numer wiersza, w którym została umieszczona.
Działanie takie ma pomóc programiście w lokalizacji usterek programu.
Jeżeli argument Test jest fałszem, Delphi wywołuje procedurę wskazywaną przez zmienną AssertErrorProc. Moduł SysUtils przypisuje tej zmiennej adres procedury, która generuje wyjątek EAssertionFailed. Jeżeli AssertErrorProc zawiera nil, wywoływany jest błąd czasu wykonania o numerze 21 (EAssertError).
Programista może dołączyć komunikat, który Delphi przekaże procedurze AssertErrorProc.
W przypadku braku tego komunikatu używany jest komunikat domyślny, np. „Assertion failed.”
Właściwe użycie procedury Assert polega na wyspecyfikowaniu warunków, jakie muszą być spełnione w celu prawidłowego działania kodu. Wszystkie programy czynią pewne założenia odnośnie wewnętrznego stanu obiektu, wartości lub poprawności argumentów procedury, wartości zwracanej przez funkcję. Dobrym rozwiązaniem odnośnie założeń jest to, aby sprawdzały one błędy programistów, a nie błędy użytkowników.
$/"
-
Chociaż działanie funkcji Assert może zostać wyłączone przy użyciu dyrektyw kompilatora $ASSERTIONS lub $C, zazwyczaj nie ma takiej potrzeby. Wyświetlenie komunikatu
„assertion error” jest niepokojącym symptomem dla użytkownika, niemniej jednak o wiele lepiej będzie, jeżeli program zakończy się dziwnym komunikatem, niż gdyby miał działać dalej i na przykład uszkodzić cenne dane użytkownika.
Niniejszy podrozdział zawiera kilka przykładów użycia procedury Assert, występujących w opisie innych elementów języka — patrz procedura Move, funkcja TypeInfo, funkcje VarArray-Lock i VarIsArray.
AssertErrorProc, $ASSERTIONS, $C