Thread View: pl.comp.lang.asm
44 messages
44 total messages
Started by Wojtas
Thu, 16 Aug 2007 16:55
CPUID
Author: Wojtas
Date: Thu, 16 Aug 2007 16:55
Date: Thu, 16 Aug 2007 16:55
22 lines
1772 bytes
1772 bytes
Witam. Na stronie: http://www.sandpile.org/ia32/cpuid.htm jest napisane: "bit 28 (HTT) Hyper-Threading Technology, PAUSE" Czyli jeśli dobrze rozumiem - bit 1 oznacza, że procesor ma HTT, a 0, że nie. No więc robię coś takiego (wstawka asemblerowa w Delphi): push esi push ebx mov eax, 1 dw $a20f; instrukcja cpuid mov _edx, edx; _edx to 32 bitowa zmienna typu Integer pop ebx pop esi no i moje pytanie brzmi - jak wyciągnąć z _edx informację czy procek obsługuje HTT? Wiem, że trzeba wykonać operację przesuwania bitów - ale w lewo czy w prawo? I trzeba używać operatora and? I o jaką wartość przesunąć? 28?
Re: CPUID
Author: Wiktor S.
Date: Thu, 16 Aug 2007 17:46
Date: Thu, 16 Aug 2007 17:46
48 lines
2058 bytes
2058 bytes
> Na stronie: http://www.sandpile.org/ia32/cpuid.htm > jest napisane: > "bit 28 (HTT) Hyper-Threading Technology, PAUSE" > Czyli jeśli dobrze rozumiem - bit 1 oznacza, że procesor ma HTT, a 0, > że nie. > No więc robię coś takiego (wstawka asemblerowa w Delphi): > > push esi > push ebx > > mov eax, 1 > dw $a20f; instrukcja cpuid czemu robisz dw zamiast po prostu cpuid, taki stary masz asembler? > mov _edx, edx; _edx to 32 bitowa zmienna typu Integer > > pop ebx > pop esi > > no i moje pytanie brzmi - jak wyciągnąć z _edx informację czy procek > obsługuje HTT? przede wszystkim niepotrzebnie zapisujesz do pamięci, takie operacje się wykonuje bezpośrednio na rejestrze. > Wiem, że trzeba wykonać operację przesuwania bitów - ale w lewo czy w > prawo? I trzeba używać operatora and? I o jaką wartość przesunąć? 28? zainteresuj się instrukcją bt (Bit Test). bt edx,28 ; sprawdź bit 28 rejestru edx. następnie należy wykonać jc/jnc. jc jestht niemaht: albo bt edx,28 ; sprawdź bit 28 rejestru edx. następnie należy wykonać jc/jnc. jnc niemaht jestht: -- Azarien
Re: CPUID
Author: Wojtas
Date: Thu, 16 Aug 2007 22:19
Date: Thu, 16 Aug 2007 22:19
49 lines
2335 bytes
2335 bytes
> czemu robisz dw zamiast po prostu cpuid, taki stary masz asembler? na kazdej stronie jaką widzialem to tak bylo... a czasem nawet: DB 00001111b, 10100010b lub: db $0F, $A2 > przede wszystkim niepotrzebnie zapisujesz do pamięci, takie operacje się > wykonuje bezpośrednio na rejestrze. wiem, ale już sam nie wiedziałem co robić to zacząłem kombinować... Coś mi nadal nie działa: function isHTT : boolean; //nazwa na razie nie ważna var bit : byte; begin asm push esi push ebx mov eax, 1 cpuid bt edx, 31; Bit to 3DNow! jc @jestht mov bit, 0 jmp @koniec @jestht: mov bit, 1 @koniec: pop ebx pop esi end; messagebox(0, pchar(inttostr(bit)), '', 0); end; domyślam się że niepotrzebna jest zmienna Bit bo wynik będzie wartością zwracaną przez funkcję - ale ten wynik jest błedny... pokazuje 1... a mój procek to Celeron D więc nie ma 3DNow! sprawdzałem Bit Test dla FPU (Bit 0) i też nie bardzo działa... co do etykiet - próbuję już wszystkiego.
Re: CPUID
Author: Wojciech Muła
Date: Thu, 16 Aug 2007 22:40
Date: Thu, 16 Aug 2007 22:40
12 lines
1371 bytes
1371 bytes
Wojtas wrote: > domyślam się że niepotrzebna jest zmienna Bit bo wynik będzie > wartością zwracaną przez funkcję - ale ten wynik jest błedny... > > pokazuje 1... a mój procek to Celeron D więc nie ma 3DNow! > > sprawdzałem Bit Test dla FPU (Bit 0) i też nie bardzo działa... Rozkaz cpuid modyfikuje rejestey eax, ebx, ecx, edx - zapamiętujesz tylko ebx i to może być przyczyną. w.
Re: CPUID
Author: Wojtas
Date: Fri, 17 Aug 2007 07:57
Date: Fri, 17 Aug 2007 07:57
17 lines
2014 bytes
2014 bytes
On 17 Sie, 00:40, Wojciech Muła <wojciech_m...@poczta.null.onet.pl.invalid> wrote: > Wojtas wrote: > > domyślam się że niepotrzebna jest zmienna Bit bo wynik będzie > > wartością zwracaną przez funkcję - ale ten wynik jest błedny... > > > pokazuje 1... a mój procek to Celeron D więc nie ma 3DNow! > > > sprawdzałem Bit Test dla FPU (Bit 0) i też nie bardzo działa... > > Rozkaz cpuid modyfikuje rejestey eax, ebx, ecx, edx - zapamiętujesz > tylko ebx i to może być przyczyną. > > w. Wiem, że modyfikuje eax, ebx, ecx, edx. Ale po co mam zapamiętywać pozostałe, skoro wartość wrzucam do zmiennej bit?
Re: CPUID
Author: Kicer
Date: Fri, 17 Aug 2007 08:55
Date: Fri, 17 Aug 2007 08:55
11 lines
1287 bytes
1287 bytes
Wojtas wrote: > Wiem, że modyfikuje eax, ebx, ecx, edx. > Ale po co mam zapamiętywać pozostałe, skoro wartość wrzucam do > zmiennej bit? bo delphi zakłada ze przed i po wyjsciu z Twojej procedury w asmie rejestry sie nie zmienią (moze trzymac jakies adres, wartosci itp) -- Michał Walenciak, gg: 3729519, mail: Kicer86 na gmail kropka com http://kicer.elsat.net.pl
Re: CPUID
Author: Wiktor S.
Date: Fri, 17 Aug 2007 08:59
Date: Fri, 17 Aug 2007 08:59
85 lines
2620 bytes
2620 bytes
Wojtas wrote: >> czemu robisz dw zamiast po prostu cpuid, taki stary masz asembler? > > na kazdej stronie jaką widzialem to tak bylo... > a czasem nawet: > DB 00001111b, 10100010b > lub: > db $0F, $A2 > >> przede wszystkim niepotrzebnie zapisujesz do pamięci, takie operacje >> się wykonuje bezpośrednio na rejestrze. > wiem, ale już sam nie wiedziałem co robić to zacząłem kombinować... > > Coś mi nadal nie działa: > > function isHTT : boolean; //nazwa na razie nie ważna > var > bit : byte; > begin > asm > push esi > push ebx > > mov eax, 1 > cpuid > bt edx, 31; Bit to 3DNow! > jc @jestht > > mov bit, 0 > jmp @koniec > > @jestht: > mov bit, 1 > > @koniec: > > pop ebx > pop esi > end; > messagebox(0, pchar(inttostr(bit)), '', 0); > end; > > domyślam się że niepotrzebna jest zmienna Bit bo wynik będzie > wartością zwracaną przez funkcję - ale ten wynik jest błedny... > > pokazuje 1... a mój procek to Celeron D więc nie ma 3DNow! > > sprawdzałem Bit Test dla FPU (Bit 0) i też nie bardzo działa... > > co do etykiet - próbuję już wszystkiego. zobacz to (piszę na sucho, nie sprawdzałem): function isHTT : boolean; assembler; //nazwa na razie nie ważna asm push ebx mov eax,1 cpuid bt edx,31 jc @jestht xor al,al jmp @koniec @jestht: mov al,1 @koniec: pop ebx end; wersja bez skoków: function isHTT : boolean; assembler; //nazwa na razie nie ważna asm push ebx mov eax,1 cpuid bt edx,31 mov al,0 // nie zmieniać na xor ani sub (flagi!) rcl al,1 pop ebx end; -- Azarien
Re: CPUID
Author: Michal Schulz
Date: Fri, 17 Aug 2007 09:05
Date: Fri, 17 Aug 2007 09:05
22 lines
1231 bytes
1231 bytes
Wiktor S. wrote:
Prawie dobrze, ale...
> function isHTT : boolean; assembler; //nazwa na razie nie ważna
> asm
> push ebx
> mov eax,1
> cpuid
> bt edx,31
te dwie instrukcje
> mov al,0 // nie zmieniać na xor ani sub (flagi!)
> rcl al,1
mozna zamienic na jedna
setc al
SETx jest obslugiwana od czasow 80386.
--
Michal Schulz
Re: CPUID
Author: Wiktor S.
Date: Fri, 17 Aug 2007 09:33
Date: Fri, 17 Aug 2007 09:33
13 lines
1219 bytes
1219 bytes
> te dwie instrukcje >> mov al,0 // nie zmieniać na xor ani sub (flagi!) >> rcl al,1 > > mozna zamienic na jedna > setc al > > SETx jest obslugiwana od czasow 80386. o, fajne ;-) -- Azarien
Re: CPUID
Author: Wojciech Muła
Date: Fri, 17 Aug 2007 09:41
Date: Fri, 17 Aug 2007 09:41
8 lines
1168 bytes
1168 bytes
Wiktor S. wrote: >> SETx jest obslugiwana od czasow 80386. > > o, fajne ;-) W książkach o asemblerze tego **jeszcze** nie ma?... w.
Re: CPUID
Author: Wiktor S.
Date: Fri, 17 Aug 2007 11:04
Date: Fri, 17 Aug 2007 11:04
11 lines
1296 bytes
1296 bytes
>>> SETx jest obslugiwana od czasow 80386. >> o, fajne ;-) > W książkach o asemblerze tego **jeszcze** nie ma?... Nie wiem, nie czytam. Nigdzie nie mówiłem, że znam WSZYSTKIE instrukcje x86 :-) -- Azarien
Re: CPUID
Author: Wojtas
Date: Fri, 17 Aug 2007 11:26
Date: Fri, 17 Aug 2007 11:26
7 lines
1745 bytes
1745 bytes
Niestety Wiktor - twoje dwie funkcje zawsze zwracają True (czyli dla HTT (bit 28) jak i 3DNow! (bit 31))... A np. program SiSoftware Sandra Lite 2007 mierzy wszystko poprawnie... (czyli pokazuje, że nie mam 3DNow! i HTT). Nie wiem już co jest nie tak...
Re: CPUID
Author: Wojtas
Date: Fri, 17 Aug 2007 11:33
Date: Fri, 17 Aug 2007 11:33
6 lines
1883 bytes
1883 bytes
Kurde pomyłka z tym bitem 31. Strona mi się przescrollowała :) Okazało się, że "bit 31 (PBE) Pending Break Event, STPCLK, FERR#, MISC_ENABLE.PBE" ale bit 28 to nadal HTT. A funkcje nadal nie działają.
Re: CPUID
Author: Michal Schulz
Date: Fri, 17 Aug 2007 12:03
Date: Fri, 17 Aug 2007 12:03
51 lines
1980 bytes
1980 bytes
Wojtas wrote:
> Kurde pomyłka z tym bitem 31. Strona mi się przescrollowała :)
> Okazało się, że "bit 31 (PBE) Pending Break Event, STPCLK, FERR#,
> MISC_ENABLE.PBE"
> ale bit 28 to nadal HTT.
>
> A funkcje nadal nie działają.
To naprawde nie jest takie trudne.... Najglupszy przyklad konwertujacy
jeszcze otrzymana wartosc do stringa:
function cpuid:string;
var v:byte;
begin
asm
push ebx
mov eax, 1
cpuid
bt edx, 28
setc v
pop ebx
end;
result := IntToHex(v, 2);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := cpuid;
end;
dziala u mnie. Masz jeszcze jakis problem?
zrobienie z tego funkcji w stylu:
function isHT:byte;
asm
push ebx
mov eax, 1
cpuid
bt edx, 28
setc al
pop ebx
end;
tez nie jest nadmiernie trudne...
Pytania?
--
Michal Schulz
Re: CPUID
Author: Wojtas
Date: Fri, 17 Aug 2007 12:18
Date: Fri, 17 Aug 2007 12:18
10 lines
1895 bytes
1895 bytes
> dziala u mnie. Masz jeszcze jakis problem? Tak - u mnie obie funkcje zwracają 1! > Pytania? Tak. Dlaczego tak się dzieje? Mój procesor nie ma HTT. > To naprawde nie jest takie trudne... Zgadzam się, tylko nie rozumiem, dlaczego ciagle mi zwraca 1...
Re: CPUID
Author: Michal Schulz
Date: Fri, 17 Aug 2007 12:23
Date: Fri, 17 Aug 2007 12:23
22 lines
1554 bytes
1554 bytes
Wojtas wrote: >> dziala u mnie. Masz jeszcze jakis problem? > > Tak - u mnie obie funkcje zwracają 1! wyprobuj sobie: function cpuid:longint; asm push ebx mov eax, 1 cpuid mov eax,edx pop ebx end; I powiedz nam, dlaczego w zwracanym typie longint bit nr. 28 jest zapalony :P -- Michal Schulz
Re: CPUID
Author: Michal Schulz
Date: Fri, 17 Aug 2007 12:33
Date: Fri, 17 Aug 2007 12:33
8 lines
1257 bytes
1257 bytes
Wojtas wrote: http://www.swissdelphicenter.ch/torry/showcode.php?id=2044 -- Michal Schulz
Re: CPUID
Author: Wojtas
Date: Fri, 17 Aug 2007 12:51
Date: Fri, 17 Aug 2007 12:51
32 lines
2579 bytes
2579 bytes
> I powiedz nam, dlaczego w zwracanym typie longint bit nr. 28 jest
> zapalony :P
Trzeba go zanegować czy cuś? Bo jak nie o to chodzi to pojęcia nie
mam :)
> http://www.swissdelphicenter.ch/torry/showcode.php?id=2044
znam ten link... już wcześniej z niego trochę skorzystałem, ale nie
zwróciłem uwagi na sposób w jaki odczytują bity.
Dla testu wymodziłem coś takiego:
procedure IsHTT;
var
_eax : Integer;
begin
asm
push ebx
mov eax, 1
cpuid
mov _eax, eax
pop ebx
end;
if (_eax and $04000000) = $04000000 then
MessageBox(0, 'Bit 28 zapalony - HTT obsługiwane.', 'CPUID:', 0)
else MessageBox(0, 'Bit 28 zgaszony - HTT NIE obsługiwane.',
'CPUID:', 0);
end;
Odpala się MessageBox(0, 'Bit 28 zgaszony - HTT NIE obsługiwane.',
'CPUID:', 0);
Tylko czy ja to dobrze zrobiłem?
Re: CPUID
Author: Wojtas
Date: Fri, 17 Aug 2007 13:20
Date: Fri, 17 Aug 2007 13:20
2 lines
1933 bytes
1933 bytes
Kurna ale namieszałem, przecież teraz sprawdzam SSE2, tylko jaką wartość wpisać żeby dostać się do bitu 28? Jak się to oblicza?
Re: CPUID
Author: Wiktor S.
Date: Fri, 17 Aug 2007 14:46
Date: Fri, 17 Aug 2007 14:46
31 lines
1782 bytes
1782 bytes
>> dziala u mnie. Masz jeszcze jakis problem?
> Tak - u mnie obie funkcje zwracają 1!
>> Pytania?
> Tak. Dlaczego tak się dzieje? Mój procesor nie ma HTT.
nie ma cudów.
function cpuid:longword;
begin
asm
push ebx
mov eax, 1
cpuid
mov eax,edx
end;
end;
...
edit1.text:=inttostr(cpuid);
podaj jaką liczbę ta funkcja zwraca.
--
Azarien
Re: CPUID
Author: Bogdan (bogdro)
Date: Fri, 17 Aug 2007 15:08
Date: Fri, 17 Aug 2007 15:08
31 lines
2421 bytes
2421 bytes
Wojtas pisze:
> Kurna ale namieszałem, przecież teraz sprawdzam SSE2, tylko jaką
> wartość wpisać żeby dostać się do bitu 28? Jak się to oblicza?
W zależności od posiadanego kompilatora:
and edx, 1 shl 28
and edx, 1 << 28
Masz 32 bity w EDX, czyli 4 bajty: xx xx xx xx. Najstarszy bajt
zawiera bity od 28 do 31 włącznie. Bit 28=1 oznacza, że wartość
najstarszego bajtu wynosi 1, reszta 0, czyli 01 00 00 00 (hex):
and edx, 01000000h
Swoją drogą, jak na Celeronie chcesz sprawdzać 3DNow? Możesz sobie co
najwyżej sprawdzić MMX.
A u mnie kod
mov eax, 1
cpuid
shr edx, 28
mov ebx, edx
działa poprawnie, tj. zwraca 0 :) (Celeron-686).
--
Pozdrawiam/Regards - Bogdan (Linux & FreeDOS)
Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: CPUID
Author: Michal Schulz
Date: Fri, 17 Aug 2007 15:08
Date: Fri, 17 Aug 2007 15:08
15 lines
1382 bytes
1382 bytes
Wiktor S. wrote:
> function cpuid:longword;
> begin
> asm
> push ebx
> mov eax, 1
> cpuid
> mov eax,edx
pop ebx
> end;
> end;
--
Michal Schulz
Re: CPUID
Author: Bogdan (bogdro)
Date: Fri, 17 Aug 2007 15:13
Date: Fri, 17 Aug 2007 15:13
39 lines
2286 bytes
2286 bytes
Wiktor S. pisze: >>> dziala u mnie. Masz jeszcze jakis problem? > >> Tak - u mnie obie funkcje zwracają 1! > >>> Pytania? > >> Tak. Dlaczego tak się dzieje? Mój procesor nie ma HTT. > > nie ma cudów. > > function cpuid:longword; > begin > asm > push ebx > mov eax, 1 > cpuid > mov eax,edx > end; > end; > > ... > > edit1.text:=inttostr(cpuid); > > > podaj jaką liczbę ta funkcja zwraca. Według mnie zwróci coś z przedziału od bluescreena do okienka, że system Windows ubolewa, ale musiał zamknąć program. Chyba że automagicznie delphi doda brakujący "pop ebx" :) Ale pomysł dobry, niech pytający przyśle jakiś wynik, żeby można było zdiagnozować. -- Pozdrawiam/Regards - Bogdan (Linux & FreeDOS) Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: CPUID
Author: Michal Schulz
Date: Fri, 17 Aug 2007 15:14
Date: Fri, 17 Aug 2007 15:14
15 lines
1720 bytes
1720 bytes
Wojtas wrote: > Kurna ale namieszałem, przecież teraz sprawdzam SSE2, tylko jaką > wartość wpisać żeby dostać się do bitu 28? Jak się to oblicza? w delphi: 1 shl 28 innymi slowy, przesuwasz bit numer ZERO o 28 miejsc w lewo. Kolega widze za CPUID sie zabiera, a wiedzy elementarnej dla kazdego programisty (nie tylko dla assemblerowcow) brak... -- Michal Schulz
Re: CPUID
Author: Wojtas
Date: Fri, 17 Aug 2007 15:30
Date: Fri, 17 Aug 2007 15:30
24 lines
2190 bytes
2190 bytes
No więc funkcja:
function cpuid:longword;
begin
asm
push ebx
mov eax, 1
cpuid
mov eax,edx
pop ebx
end;
end;
zwraca 4224632.
Michal Shulz wrote:
> 1 shl 28
> innymi slowy, przesuwasz bit numer ZERO o 28 miejsc w lewo. Kolega widze za
> CPUID sie zabiera, a wiedzy elementarnej dla kazdego programisty (nie tylko
> dla assemblerowcow) brak...
Nie uwierzysz ale - wiem co oznacza shr, shl :)
Re: CPUID
Author: Michal Schulz
Date: Fri, 17 Aug 2007 16:01
Date: Fri, 17 Aug 2007 16:01
13 lines
1757 bytes
1757 bytes
Wojtas wrote: >> innymi slowy, przesuwasz bit numer ZERO o 28 miejsc w lewo. Kolega widze >> za CPUID sie zabiera, a wiedzy elementarnej dla kazdego programisty (nie >> tylko dla assemblerowcow) brak... > > Nie uwierzysz ale - wiem co oznacza shr, shl :) nie uwierze, ze osoba wiedzaca co oznacza shr i shl nie wie jednoczesnie jak sprawdzic, czy n-ty bit jest ustawiony... -- Michal Schulz
Re: CPUID
Author: Wiktor S.
Date: Fri, 17 Aug 2007 20:11
Date: Fri, 17 Aug 2007 20:11
30 lines
1887 bytes
1887 bytes
Wojtas wrote: > No więc funkcja: > > function cpuid:longword; > begin > asm > push ebx > mov eax, 1 > cpuid > mov eax,edx > pop ebx > end; > end; > > zwraca 4224632. wartość jest bez sensu, i odpowiada twoim cudom... dodaj xor edx,edx przed cpuid - coś się zmieniło? w jaki sposób wyświetliłeś tę liczbę - ma być traktowana jako 32-bitowa bez znaku -- Azarien
Re: CPUID
Author: Wojtas
Date: Sat, 18 Aug 2007 17:00
Date: Sat, 18 Aug 2007 17:00
22 lines
2543 bytes
2543 bytes
Wiktor S. napisał(a): > dodaj Dodałem. > przed cpuid - coś się zmieniło? Nic się nie zmieniło. > w jaki sposób wyświetliłeś tę liczbę - ma być traktowana jako 32-bitowa bez > znaku Wyświetlam w ten sposób: MessageBox(0, PChar(IntToStr(cpuid)), '', 0); > nie uwierze, ze osoba wiedzaca co oznacza shr i shl nie wie jednoczesnie jak > sprawdzic, czy n-ty bit jest ustawiony... Na wiele sposobów próbowałem używać shr, z tym, że zawsze pokazywało mi złą wartość, więc zacząłem się zastanawiać - czy ja coś robię źle?, a może muszę robić coś jeszcze? a może to jakiś błąd? albo coś od procesora? itd... dlatego napisałem temat na tej grupie...
Re: CPUID
Author: Wojciech Muła
Date: Sat, 18 Aug 2007 20:12
Date: Sat, 18 Aug 2007 20:12
20 lines
1839 bytes
1839 bytes
Wojtas wrote: > No więc funkcja: > > function cpuid:longword; > begin > asm > push ebx > mov eax, 1 > cpuid > mov eax,edx > pop ebx > end; > end; Już to pisałem: cpuid modyfikuje eax, ebx, ecx i edx. Zapamiętujesz tylko ebx, a co z ecx i edx? Kompilator nie wie, że ecx i edx są zmieniane to raczej stąd problemy. Bo głupiego testowania bitu **nie da się** spieprzyć. w.
Re: CPUID
Author: Wiktor S.
Date: Sat, 18 Aug 2007 20:28
Date: Sat, 18 Aug 2007 20:28
8 lines
1650 bytes
1650 bytes
> Już to pisałem: cpuid modyfikuje eax, ebx, ecx i edx. > Zapamiętujesz tylko ebx, a co z ecx i edx? nie trzeba. -- Azarien
Re: CPUID
Author: Wojciech Muła
Date: Sat, 18 Aug 2007 20:38
Date: Sat, 18 Aug 2007 20:38
9 lines
1651 bytes
1651 bytes
Wiktor S. wrote: >> Już to pisałem: cpuid modyfikuje eax, ebx, ecx i edx. >> Zapamiętujesz tylko ebx, a co z ecx i edx? > > nie trzeba. Gdyż albowiem? w.
Re: CPUID
Author: Michal Schulz
Date: Sat, 18 Aug 2007 20:59
Date: Sat, 18 Aug 2007 20:59
15 lines
1740 bytes
1740 bytes
Wojciech Muła wrote: > Wiktor S. wrote: >>> Już to pisałem: cpuid modyfikuje eax, ebx, ecx i edx. >>> Zapamiętujesz tylko ebx, a co z ecx i edx? >> >> nie trzeba. > > Gdyż albowiem? Albowiem pascal i delphi zakladaja automatycznie, ze kod w assemblerze modyfikuje rejestry eax, ecx i edx. -- Michal Schulz
Re: CPUID
Author: Wojciech Muła
Date: Sat, 18 Aug 2007 21:24
Date: Sat, 18 Aug 2007 21:24
7 lines
1745 bytes
1745 bytes
Michal Schulz wrote: > Albowiem pascal i delphi zakladaja automatycznie, ze kod w assemblerze > modyfikuje rejestry eax, ecx i edx. A, było tak od razu. w. (w Pascalu pisałem ostatnio z 5 lat temu)
Re: CPUID
Author: Kicer
Date: Sun, 19 Aug 2007 07:05
Date: Sun, 19 Aug 2007 07:05
29 lines
2322 bytes
2322 bytes
Wojtas wrote: > Wiktor S. napisał(a): > >> dodaj > > Dodałem. > >> przed cpuid - coś się zmieniło? > > Nic się nie zmieniło. > >> w jaki sposób wyświetliłeś tę liczbę - ma być traktowana jako >> 32-bitowa bez znaku > > Wyświetlam w ten sposób: > MessageBox(0, PChar(IntToStr(cpuid)), '', 0); > >> nie uwierze, ze osoba wiedzaca co oznacza shr i shl nie wie >> jednoczesnie jak sprawdzic, czy n-ty bit jest ustawiony... > Na wiele sposobów próbowałem używać shr, z tym, że zawsze pokazywało > mi złą wartość, więc zacząłem się zastanawiać - czy ja coś robię źle?, > a może muszę robić coś jeszcze? a może to jakiś błąd? albo coś od > procesora? itd... dlatego napisałem temat na tej grupie... a weź zapuśc gotowy program w jakims debugerze (np ollydbg) moze uda Ci sie wybadać gdzie sie chrzani -- Michał Walenciak, gg: 3729519, mail: Kicer86 na gmail kropka com http://kicer.elsat.net.pl
Re: CPUID
Author: Bogdan (bogdro)
Date: Sun, 19 Aug 2007 08:13
Date: Sun, 19 Aug 2007 08:13
23 lines
2414 bytes
2414 bytes
Michal Schulz pisze: > Wojciech Muła wrote: > >> Wiktor S. wrote: >>>> Już to pisałem: cpuid modyfikuje eax, ebx, ecx i edx. >>>> Zapamiętujesz tylko ebx, a co z ecx i edx? >>> nie trzeba. >> Gdyż albowiem? > > Albowiem pascal i delphi zakladaja automatycznie, ze kod w assemblerze > modyfikuje rejestry eax, ecx i edx. Z grubsza. Po pierwsze, nie tylko Pascal i odmiany, ale też np. C. Konkretnie mówiąc, zachowane mają być: EBX, EBP, ESI i EDI. Reszta może być używana dowolnie - mogą być zmieniane lub nie. EDX to w ogóle nie powinno być zachowywane, gdyż może zawierać część wyniku funkcji (EDX:EAX). -- Pozdrawiam/Regards - Bogdan (Linux & FreeDOS) Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: CPUID
Author: Michal Schulz
Date: Sun, 19 Aug 2007 08:24
Date: Sun, 19 Aug 2007 08:24
20 lines
2106 bytes
2106 bytes
Bogdan (bogdro) wrote: >> Albowiem pascal i delphi zakladaja automatycznie, ze kod w assemblerze >> modyfikuje rejestry eax, ecx i edx. > > Z grubsza. Po pierwsze, nie tylko Pascal i odmiany, ale też np. C. wiem > Konkretnie mówiąc, zachowane mają być: EBX, EBP, ESI i EDI. Reszta > może być używana dowolnie - mogą być zmieniane lub nie. EDX to w ogóle > nie powinno być zachowywane, gdyż może zawierać część wyniku funkcji > (EDX:EAX). Tyle, ze w sekcji asm w C (gcc :)) mozna bezposrednio przekazac kompilatorowi informacje o tym, ktore rejestry beda przez kod w assemblerze zmodyfikowane. -- Michal Schulz
Re: CPUID
Author: Bogdan (bogdro)
Date: Sun, 19 Aug 2007 08:27
Date: Sun, 19 Aug 2007 08:27
37 lines
2291 bytes
2291 bytes
Wojtas pisze: > Dla testu wymodziłem coś takiego: > > procedure IsHTT; > var > _eax : Integer; > begin > asm > push ebx > mov eax, 1 > cpuid > mov _eax, eax mov _edx, edx > pop ebx > end; > if (_eax and $04000000) = $04000000 then if ( _edx and $01000000 ) = $01000000 then > MessageBox(0, 'Bit 28 zapalony - HTT obsługiwane.', 'CPUID:', 0) > else MessageBox(0, 'Bit 28 zgaszony - HTT NIE obsługiwane.', > 'CPUID:', 0); > end; > > Odpala się MessageBox(0, 'Bit 28 zgaszony - HTT NIE obsługiwane.', > 'CPUID:', 0); > Tylko czy ja to dobrze zrobiłem? Spróbuj teraz. -- Pozdrawiam/Regards - Bogdan (Linux & FreeDOS) Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: CPUID
Author: Wojtas
Date: Sun, 19 Aug 2007 09:43
Date: Sun, 19 Aug 2007 09:43
58 lines
3276 bytes
3276 bytes
On 19 Sie, 10:27, "Bogdan (bogdro)" <bog...@poczta.gazeta.pl> wrote:
> Wojtas pisze:
>
> > Dla testu wymodzi em co takiego:
>
> > procedure IsHTT;
> > var
> > _eax : Integer;
> > begin
> > asm
> > push ebx
> > mov eax, 1
> > cpuid
> > mov _eax, eax
>
> mov _edx, edx
>
> > pop ebx
> > end;
> > if (_eax and $04000000) = $04000000 then
>
> if ( _edx and $01000000 ) = $01000000 then
>
> > MessageBox(0, 'Bit 28 zapalony - HTT obs ugiwane.', 'CPUID:', 0)
> > else MessageBox(0, 'Bit 28 zgaszony - HTT NIE obs ugiwane.',
> > 'CPUID:', 0);
> > end;
>
> > Odpala si MessageBox(0, 'Bit 28 zgaszony - HTT NIE obs ugiwane.',
> > 'CPUID:', 0);
> > Tylko czy ja to dobrze zrobi em?
>
> Spróbuj teraz.
>
> --
> Pozdrawiam/Regards - Bogdan (Linux & FreeDOS)
> Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro
> Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
> Rozmawiaj bezpiecznie:www.JabberPL.orgSurfuj anonimowo: tor.eff.org
procedure ishtt;
var
_edx : integer;
begin
asm
push ebx
mov eax, 1
cpuid
mov _edx, edx
pop ebx
end;
if ( _edx and $01000000 ) = $01000000 then
MessageBox(0, 'Bit 28 zapalony - HTT obs ugiwane.', 'CPUID:', 0)
else MessageBox(0, 'Bit 28 zgaszony - HTT NIE obs ugiwane.',
'CPUID:', 0);
end;
Pokazuje, e HTT jest obs ugiwane...
Re: CPUID
Author: Wojciech Muła
Date: Sun, 19 Aug 2007 19:44
Date: Sun, 19 Aug 2007 19:44
7 lines
1812 bytes
1812 bytes
Bogdan (bogdro) wrote: > Z grubsza. Po pierwsze, nie tylko Pascal i odmiany, ale też np. C. Ciekawe, aż sprawdziłem z gcc i wychodzi, że masz rację. Tylko nie mogę zlokalizować tego w dokumentacji, pomożecie? w.
Re: CPUID
Author: Bogdan (bogdro)
Date: Mon, 20 Aug 2007 15:03
Date: Mon, 20 Aug 2007 15:03
15 lines
2224 bytes
2224 bytes
Wojciech Muła pisze: > Bogdan (bogdro) wrote: >> Z grubsza. Po pierwsze, nie tylko Pascal i odmiany, ale też np. C. > > Ciekawe, aż sprawdziłem z gcc i wychodzi, że masz rację. Tylko > nie mogę zlokalizować tego w dokumentacji, pomożecie? Raczej nie ma. Lepiej wyszukaj "x86 Application Binary Interface", bo tak się ten "standard" nazywa. -- Pozdrawiam/Regards - Bogdan (Linux & FreeDOS) Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: CPUID
Author: Paweł Pawlak
Date: Tue, 21 Aug 2007 15:25
Date: Tue, 21 Aug 2007 15:25
15 lines
1604 bytes
1604 bytes
Kicer pisze: > Wojtas wrote: > > >> Wiem, że modyfikuje eax, ebx, ecx, edx. >> Ale po co mam zapamiętywać pozostałe, skoro wartość wrzucam do >> zmiennej bit? > bo delphi zakłada ze przed i po wyjsciu z Twojej procedury w asmie > rejestry sie nie zmienią (moze trzymac jakies adres, wartosci itp) Według intelowskiego ABI (Application Binary Interface) rejestrów EAX, ECX i EDX nie trzeba przywracać do stanu sprzed wywołania procedury. Pozdrawiam, Morris
Re: CPUID
Author: Paweł Pawlak
Date: Tue, 21 Aug 2007 15:36
Date: Tue, 21 Aug 2007 15:36
27 lines
1989 bytes
1989 bytes
Bogdan (bogdro) pisze: > Wojtas pisze: >> Dla testu wymodziłem coś takiego: >> >> procedure IsHTT; >> var >> _eax : Integer; >> begin >> asm >> push ebx >> mov eax, 1 >> cpuid >> mov _eax, eax > > mov _edx, edx > >> pop ebx >> end; >> if (_eax and $04000000) = $04000000 then > > if ( _edx and $01000000 ) = $01000000 then Ja bym obstawiał, że zapalony bit numer 28 jest reprezentowany przez wartość $10000000 a nie $01000000 Pozdrawiam, Morris
Re: CPUID
Author: Jakub Bogusz
Date: Tue, 21 Aug 2007 17:40
Date: Tue, 21 Aug 2007 17:40
36 lines
2443 bytes
2443 bytes
W Pt, 17 VIII 2007 o 15:30 GMT, Wojtas napisał(a): > No więc funkcja: > > function cpuid:longword; > begin > asm > push ebx > mov eax, 1 > cpuid > mov eax,edx > pop ebx > end; > end; > > zwraca 4224632. Czyli jakąś bzdurę. Nie pamiętam już borlandowych wynalazków - czy w Delphi aby na pewno wartość funkcji zwraca się przez eax? IIRC inaczej było dla funkcji typu "assembler", a inaczej w przypadku takim jak powyżej. Coś mi się przypomina przypisywanie wyniku pod @Result, tylko nie pamiętam w którym przypadku (i czy dotyczyło to także wersji 32-bitowej). Po drugie w przypadku zapisywania wyników z poziomu asemblera do zmiennej radziłbym zrobić "pop ebx" wcześniej (nie wiem jak Delphi, gcc potrafi wykorzystać %ebx do przechowywania adresu zmiennej, jeśli nie określi się tego rejestru jako wykorzystywanego). Można też kod wynikowy zdisasemblować albo uruchomić pod debuggerem, żeby zobaczyć co się dzieje. -- Jakub Bogusz | http://qboosh.pl/
Re: CPUID
Author: Bogdan (bogdro)
Date: Tue, 21 Aug 2007 18:41
Date: Tue, 21 Aug 2007 18:41
11 lines
1881 bytes
1881 bytes
Paweł Pawlak pisze: > Ja bym obstawiał, że zapalony bit numer 28 jest reprezentowany przez > wartość $10000000 a nie $01000000 Słusznie prawisz :) Za dużo asma chyba ostatnio zażywam... -- Pozdrawiam/Regards - Bogdan (Linux & FreeDOS) Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads