🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
44 messages
44 total messages Started by Wojtas Thu, 16 Aug 2007 16:55
CPUID
#1427
Author: Wojtas
Date: Thu, 16 Aug 2007 16:55
22 lines
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
#1428
Author: Wiktor S.
Date: Thu, 16 Aug 2007 17:46
48 lines
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
#1429
Author: Wojtas
Date: Thu, 16 Aug 2007 22:19
49 lines
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
#1430
Author: Wojciech Muła
Date: Thu, 16 Aug 2007 22:40
12 lines
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
#1431
Author: Wojtas
Date: Fri, 17 Aug 2007 07:57
17 lines
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
#1432
Author: Kicer
Date: Fri, 17 Aug 2007 08:55
11 lines
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
#1434
Author: Wiktor S.
Date: Fri, 17 Aug 2007 08:59
85 lines
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
#1435
Author: Michal Schulz
Date: Fri, 17 Aug 2007 09:05
22 lines
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
#1436
Author: Wiktor S.
Date: Fri, 17 Aug 2007 09:33
13 lines
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
#1437
Author: Wojciech Muła
Date: Fri, 17 Aug 2007 09:41
8 lines
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
#1438
Author: Wiktor S.
Date: Fri, 17 Aug 2007 11:04
11 lines
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
#1439
Author: Wojtas
Date: Fri, 17 Aug 2007 11:26
7 lines
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
#1440
Author: Wojtas
Date: Fri, 17 Aug 2007 11:33
6 lines
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
#1441
Author: Michal Schulz
Date: Fri, 17 Aug 2007 12:03
51 lines
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
#1442
Author: Wojtas
Date: Fri, 17 Aug 2007 12:18
10 lines
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
#1443
Author: Michal Schulz
Date: Fri, 17 Aug 2007 12:23
22 lines
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
#1444
Author: Michal Schulz
Date: Fri, 17 Aug 2007 12:33
8 lines
1257 bytes
Wojtas wrote:


http://www.swissdelphicenter.ch/torry/showcode.php?id=2044


-- 
Michal Schulz
Re: CPUID
#1445
Author: Wojtas
Date: Fri, 17 Aug 2007 12:51
32 lines
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
#1446
Author: Wojtas
Date: Fri, 17 Aug 2007 13:20
2 lines
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
#1453
Author: Wiktor S.
Date: Fri, 17 Aug 2007 14:46
31 lines
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
#1447
Author: Bogdan (bogdro)
Date: Fri, 17 Aug 2007 15:08
31 lines
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
#1454
Author: Michal Schulz
Date: Fri, 17 Aug 2007 15:08
15 lines
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
#1455
Author: Bogdan (bogdro)
Date: Fri, 17 Aug 2007 15:13
39 lines
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
#1448
Author: Michal Schulz
Date: Fri, 17 Aug 2007 15:14
15 lines
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
#1456
Author: Wojtas
Date: Fri, 17 Aug 2007 15:30
24 lines
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
#1457
Author: Michal Schulz
Date: Fri, 17 Aug 2007 16:01
13 lines
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
#1458
Author: Wiktor S.
Date: Fri, 17 Aug 2007 20:11
30 lines
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
#1459
Author: Wojtas
Date: Sat, 18 Aug 2007 17:00
22 lines
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
#1461
Author: Wojciech Muła
Date: Sat, 18 Aug 2007 20:12
20 lines
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
#1462
Author: Wiktor S.
Date: Sat, 18 Aug 2007 20:28
8 lines
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
#1463
Author: Wojciech Muła
Date: Sat, 18 Aug 2007 20:38
9 lines
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
#1464
Author: Michal Schulz
Date: Sat, 18 Aug 2007 20:59
15 lines
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
#1465
Author: Wojciech Muła
Date: Sat, 18 Aug 2007 21:24
7 lines
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
#1460
Author: Kicer
Date: Sun, 19 Aug 2007 07:05
29 lines
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
#1466
Author: Bogdan (bogdro)
Date: Sun, 19 Aug 2007 08:13
23 lines
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
#1467
Author: Michal Schulz
Date: Sun, 19 Aug 2007 08:24
20 lines
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
#1449
Author: Bogdan (bogdro)
Date: Sun, 19 Aug 2007 08:27
37 lines
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
#1450
Author: Wojtas
Date: Sun, 19 Aug 2007 09:43
58 lines
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
#1468
Author: Wojciech Muła
Date: Sun, 19 Aug 2007 19:44
7 lines
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
#1469
Author: Bogdan (bogdro)
Date: Mon, 20 Aug 2007 15:03
15 lines
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
#1433
Author: Paweł Pawlak
Date: Tue, 21 Aug 2007 15:25
15 lines
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
#1451
Author: Paweł Pawlak
Date: Tue, 21 Aug 2007 15:36
27 lines
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
#1470
Author: Jakub Bogusz
Date: Tue, 21 Aug 2007 17:40
36 lines
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
#1452
Author: Bogdan (bogdro)
Date: Tue, 21 Aug 2007 18:41
11 lines
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