Avatar billede borrisholt Novice
07. juli 2005 - 10:00 Der er 4 kommentarer og
1 løsning

Hvad betyder "TYPE int"

Jeg sidder og skal prote noget C++ kode til Delphi.  Det plejer ikke ar være så svært. Denne gang er det noget med at finde Cache i din CPU, og er derfor mest i Assembler. Såmeget desto nemmere tænkte jeg ....

Men hvad betyder "TYPE int" ?

#ifdef CPUID_AWARE_COMPILER
    #define CPUID_INSTRUCTION        cpuid
#else
    #define CPUID_INSTRUCTION        _asm _emit 0x0f _asm _emit 0xa2
#endif



bool __cdecl CPUInfo::RetrieveCPUCacheDetails ()
{
int L1Cache[4] = { 0, 0, 0, 0 };
int L2Cache[4] = { 0, 0, 0, 0 };

// Check to see if what we are about to do is supported...
if (RetrieveCPUExtendedLevelSupport (0x80000005))
{
  // Use assembly to retrieve the L1 cache information ...
  __try {
  _asm {
#ifdef CPUID_AWARE_COMPILER
    ; we must push/pop the registers <<CPUID>> writes to, as the
    ; optimiser doesn't know about <<CPUID>>, and so doesn't expect
    ; these registers to change.
    push eax
    push ebx
    push ecx
    push edx
#endif
    ; <<CPUID>>
    ; eax = 0x80000005 --> eax: L1 cache information - Part 1 of 4.
    ;                      ebx: L1 cache information - Part 2 of 4.
    ;                      edx: L1 cache information - Part 3 of 4.
    ;                      ecx: L1 cache information - Part 4 of 4.
    mov eax, 0x80000005
    CPUID_INSTRUCTION
    mov L1Cache[0 * TYPE int], eax
    mov L1Cache[1 * TYPE int], ebx
    mov L1Cache[2 * TYPE int], ecx
    mov L1Cache[3 * TYPE int], edx

#ifdef CPUID_AWARE_COMPILER
  pop edx
  pop ecx
  pop ebx
  pop eax
#endif
  }
  }


Jens B
Avatar billede arne_v Ekspert
07. juli 2005 - 10:08 #1
jeg har har aldrig set konstruktionen

men jeg er ikke i tvivl om at det i denne kontekst svarer til sizeof(int)
Avatar billede borrisholt Novice
07. juli 2005 - 11:30 #2
Det var også mit gæt ....  DVS, så længe vi arbejder 32-bit kan man bare hardcode den til værende 4.

Altså skulle kode betyde :

        L1Cache[0] = eax
        L1Cache[1] = ebx
        L1Cache[2] = ecx
        L1Cache[3] = edx

i sådan en lidt blanding af assembler og C++ :D

Men jeg kan bare ikke få det til at fungere ... Og så ville jeg bare være sikker på at det i hevrt fald ikke var der fejlen var!


Jens B
Avatar billede borrisholt Novice
08. juli 2005 - 11:48 #3
smid et svar ..
Avatar billede arne_v Ekspert
08. juli 2005 - 12:34 #4
ok

har du fået det til at virke ?
Avatar billede borrisholt Novice
27. juli 2005 - 11:50 #5
Hej Arne ja jeg har fået det til ar virke.

Undskyld den lange respons tid.

Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester