Autor Thema: [Erledigt] CPUID hilfe!!!  (Gelesen 11163 mal)

Programm Noob

  • Gast
Gespeichert
« am: 19. November 2009, 00:11 »
Moin

Ich hab mit hilfe des Wiki´s mir eine schöne CPUID Funktion gebastelt, doch irgenwie haut das vorn und hinten nicht hin.
Hir mein Code.
#include ".\include\video.h"

/**
 * cpuid_check prüft, ob cpuid auf diesem PC funktioniert,
 * wenn nicht dann als rückgabewert eine 0,
 * wenn ja dann als rückgabewert eine 1
 * und wenn es nicht überprüft erden kann ob nun ja oder nein eine 3.
 */
char cpuid_check()
{
char EAX;
char ECX;
asm volatile("pushfd"
"pushfd"
"pop ecx"
"mov eax, ecx"
"xor eax, 0x200000"
"push eax"
"popfd"
"pushfd"
"pop eax"
"mov %0, eax"
"mov %1, ecx"::"%0"(EAX), "%1" (ECX));
if (EAX == ECX)
{
return 0;
}
else if (EAX != ECX)
{
return 1;
}
else
{
return 3;
}
}

/**
 * cpuid ruft die cpuid funktion des Prozessors auf und vergleicht
 * die Vendor-ID mit gespeichteten werten und gibt den Prozessorhersteller Namen aus.
 */
int cpuid()
{
char EAX;
char EBX;
char ECX;
char EDX;
int cpuid_check_ret;
cpuid_check_ret = cpuid_check();
if (cpuid_check_ret == 0)
{
//gebe Meldung aus, dass CPUID nicht unterstützt wird!
}
else if (cpuid_check_ret == 1) // führe CPUID aus.
{
asm volatile("mov eax, 0x00000000"
"cpuid"
"mov %0, eax"
"mov %1, ebx"
"mov %2, ecx"
"mov %3, edx"::"%0"(EAX), "%1" (EBX), "%2" (ECX), "%3" (EDX));

if (EBX == "Auth" && EDX == "enti" %% ECX == "cAMD") // ist er von AMD?
{
printf("Der Prozessor ist von AMD.", 2, 0xA); // Gebe "Der prozessor ist von AMD" aus
}
else if (EBX == "Cent" && EDX == "aurH" %% ECX == "auls") // ist er von Centaur?
{
printf("Der Prozessor ist von Centaur.", 2, 0xA); // Gebe "Der prozessor ist von Centaur" aus
}
else if (EBX == "Cyri" && EDX == "xIns" %% ECX == "tead") // ist er von Cyrix?
{
printf("Der Prozessor ist von Cyrix.", 2, 0xA); // Gebe "Der prozessor ist von Cyrix" aus
}
else if (EBX == "Genu" && EDX == "eneI" %% ECX == "ntel") // ist er von Intel?
{
printf("Der Prozessor ist von Intel.", 2, 0xA);  // Gebe "Der prozessor ist von Intel" aus
}
else if (EBX == "NexG" && EDX == "enDr" %% ECX == "iven") // ist er von NexGen ?
{
printf("Der Prozessor ist von NexGen.", 2, 0xA);  // Gebe "Der prozessor ist von NexGen" aus
}
else if (EBX == "Geod" && EDX == "e by" %% ECX == " NSC") // ist er von National Semiconductor ?
{
printf("Der Prozessor ist von National Semiconductor.", 2, 0xA);  // Gebe "Der prozessor ist von National Semiconductor " aus
}
else if (EBX == "Rise" && EDX == "Rise" %% ECX == "Rise") // ist er von Rise?
{
printf("Der Prozessor ist von Rise.", 2, 0xA);  // Gebe "Der prozessor ist von Rise" aus
}
else if (EBX == "SiS " && EDX == "SiS " %% ECX == "SiS ") // ist er von SiS?
{
printf("Der Prozessor ist von SiS.", 2, 0xA);  // Gebe "Der prozessor ist von SiS" aus
}
else if (EBX == "Genu" && EDX == "ineT" %% ECX == "Mx86") // ist er von Transmeta?
{
printf("Der Prozessor ist von Transmeta.", 2, 0xA);  // Gebe "Der prozessor ist von Transmeta" aus
}
else if (EBX == "UMC " && EDX == "UMC " %% ECX == "UMC ") // ist er von UMC?
{
printf("Der Prozessor ist von UMC.", 2, 0xA);  // Gebe "Der prozessor ist von UMC" aus
}
else if (EBX == "VIA " && EDX == "VIA " %% ECX == "VIA ") // ist er von VIA?
{
printf("Der Prozessor ist von VIA.", 2, 0xA);  // Gebe "Der prozessor ist von VIA" aus
}
}
else
{
printf("Es ist ein Fehler aufgetreten..", 2, 0xA); // ein Fehler ist aufgetreten.
}
}
Ich hoffe ihr könnt mir helfen.

Programm Noob
« Letzte Änderung: 20. July 2010, 02:41 von Programm Noob »

SHyx0rmZ

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 19. November 2009, 08:22 »
Könnte es sein, dass du die Ein- und Ausgabeparameter von asm() vertauscht hast? Anscheinend compilst du ja mit Intelsyntax, weiß nicht, ob das da anders ist ^^
@X="krJhbuaesrytre c a cnR.ohut";while@X[/(..)(.)/];@X=@X[3..-1]+$1;print$2;end
"Scheiß auf Perl, wir haben Kekse" - Emperor Ruby

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #2 am: 19. November 2009, 08:46 »
Ich gehe einfach mal davon aus, dass das C ist, evtl. C++. :roll:
 
Was sollen die ganzen '%%' in den IF-Abfragen? Sollten das denn nicht auch '&&' sein? Des Weiteren würde ich mal sagen, dass man in C Strings nicht per "==" vergleichen kann.
Was du machen könntest, wäre alles zu einem String zusammen zu kopieren, damit quase "AuthenticAMD" an einem Stück ist.
 
Bei den Variablen bin ich mir nicht ganz sicher, aber diese müssten (denke ich mir mal so) alles Arrays mit 4 Feldern sein, da EAX, EBX sowie ECX immer 4 Buchstaben enthalten. (*EDIT* Bsp.: char EAX[4]; *EDIT*)
 
Gruß Christian
PS: Es würde helfen, wenn du Grob sagen kannst, was funktioniert und was nicht. z.B. cpuid_check funktioniert oder so...
« Letzte Änderung: 19. November 2009, 09:03 von ChristianF »

SHyx0rmZ

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 19. November 2009, 08:50 »
Ui, stimmt. %% geht nicht, ebenso wie == bei Strings. Zudem willst du EAX, EBX, ECX und EDX wohl eher zu char* oder int machen. Und für cpuid_check_ret brauchst du auch keinen int, wenn eh nur ein char zurückgegeben wird ;-)
@X="krJhbuaesrytre c a cnR.ohut";while@X[/(..)(.)/];@X=@X[3..-1]+$1;print$2;end
"Scheiß auf Perl, wir haben Kekse" - Emperor Ruby

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #4 am: 19. November 2009, 09:02 »
Als kleine Verbesserung noch könnte man folgendes im cpuid_check ändern...
 
Lass das "else if" weg, EAX und ECX können ja entweder nur gleich oder ungleich sein (kleiner gleich würde z.B. keinen Sinn machen). Alternativ kannst du auch das gesetzte eflags-bit extrahieren und einmal vorher und einmal nachher vergleichen. :)
Somit würde auch das else in der anderen Funktion wegfallen.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 19. November 2009, 09:36 »
Ich hoffe ihr könnt mir helfen.
Das hoffe ich auch. Allerdings müsstest du dazu erstmal dein Problem beschreiben. "Tut nicht" ist keine angemessene Problembeschreibung. Anhaltspunkte, die du immer beantworten solltest: Was versuchst du zu tun? Was erwartest du, dass rauskommt? Was passiert wirklich? Ist der Code den du zeigst, wirklich der minimal nötige, um das Problem zu provozieren?

Was mir im Moment auffällt ist, dass da ein pushfd zu viel ist, oder? Aber mit dem %% dürfte das gar nicht erst kompiliert haben...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

SHyx0rmZ

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 19. November 2009, 10:15 »
Das pushfd ist warscheinlich nicht zuviel, aber es fehlt ein popfd ganz am Ende.
@X="krJhbuaesrytre c a cnR.ohut";while@X[/(..)(.)/];@X=@X[3..-1]+$1;print$2;end
"Scheiß auf Perl, wir haben Kekse" - Emperor Ruby

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 19. November 2009, 13:05 »
Meinetwegen auch sorum (aber ist es wirklich nötig?). Auf jeden Fall mehr push als pop und das ist nicht gut.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 19. November 2009, 13:33 »
Assemblersyntax ist falschrum (GCC verwendet den GAS, der AT&T-Syntax nutzt), die Register nicht mittels %0 bis %3 sondern über die richtigen Constraints übergeben.

CPUID für Funktion 0x00000000 sollte so aussehen:

unsigned int eax, ebx, ecx, edx;

 __asm__("cpuid" : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : "a"(0x00000000));

Den Code in cpuid_check solltest du analog ändern.
Dieser Text wird unter jedem Beitrag angezeigt.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #9 am: 19. November 2009, 17:18 »
Die Assemblersyntax muss nicht falschrum sein. Wenn er -masm=intel in der Kommandozeile verwendet, ist die hier vollkommen korrekt (wenn man von persönlichen Vorlieben absieht  :-) ), da der GAS nicht nur AT&T, sondern auch Intel unterstützt.

Wenn Programm Noob diese Option allerdings nicht verwendet, ist das natürlich falschrum.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 19. November 2009, 17:45 »
Ich glaube mittlerweile haben wir genug Probleme entdeckt, warum der Code überhaupt nicht kompilieren kann, dass Programmer Noob vielleicht erstmal sein Problem näher spezifizieren sollte. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Programm Noob

  • Gast
Gespeichert
« Antwort #11 am: 19. November 2009, 23:22 »
Moin

Oh, da habe ich doch glatt vergessen zu sagen das der code in c geschrieben ist, und das ich ihn wie folg aufrufe:
i586-elf-gcc -m32 -ffreestanding -o .\obj\cpuid.o -c .\src\cpuid.c -Wall -Werror -nostdinc -masm=intel
und das es nicht compilieren lässt.

Diese hier "%%" sollten natürlich auch"&&" sein. habe mich wohl vertippt. Danke.

Habe jetzt alles so wie ihr gesagt habt abgeändert:
#include ".\include\video.h"

/**
 * cpuid_check prüft, ob cpuid auf diesem PC funktioniert,
 * wenn nicht dann als rückgabewert eine 0,
 * wenn ja dann als rückgabewert eine 1
 * und wenn es nicht überprüft erden kann ob nun ja oder nein eine 3.
 */
int cpuid_check()
{
int EAX;
char ECX;
__asm__("pushfd"
"pushfd"
"pop ecx"
"mov eax, ecx"
"xor eax, 0x200000"
"push eax"
"popfd"
"pushfd"
"pop eax" : "=a"(EAX), "=c"(ECX));
if (EAX == ECX)
{
return 0;
}
else
{
return 1;
}
}

/**
 * cpuid ruft die cpuid funktion des Prozessors auf und vergleicht
 * die Vendor-ID mit gespeichteten werten und gibt den Prozessorhersteller Namen aus.
 */
int cpuid()
{
unsigned int EAX, EBX, ECX, EDX;
int cpuid_check_ret;

cpuid_check_ret = cpuid_check();

if (cpuid_check_ret == 0)
{
//gebe Meldung aus, dass CPUID nicht unterstützt wird!
}
else if (cpuid_check_ret == 1) // führe CPUID aus.
{
__asm__("cpuid" : "=a"(EAX), "=b"(EBX), "=c"(ECX), "=d"(EDX) : "a"(0x00000000));

if (EBX == "Auth" && EDX == "enti" && ECX == "cAMD") // ist er von AMD?
{
printf("Der Prozessor ist von AMD.", 2, 0xA); // Gebe "Der prozessor ist von AMD" aus
}
else if (EBX == "Cent" && EDX == "aurH" && ECX == "auls") // ist er von Centaur?
{
printf("Der Prozessor ist von Centaur.", 2, 0xA); // Gebe "Der prozessor ist von Centaur" aus
}
else if (EBX == "Cyri" && EDX == "xIns" && ECX == "tead") // ist er von Cyrix?
{
printf("Der Prozessor ist von Cyrix.", 2, 0xA); // Gebe "Der prozessor ist von Cyrix" aus
}
else if (EBX == "Genu" && EDX == "eneI" && ECX == "ntel") // ist er von Intel?
{
printf("Der Prozessor ist von Intel.", 2, 0xA);  // Gebe "Der prozessor ist von Intel" aus
}
else if (EBX == "NexG" && EDX == "enDr" && ECX == "iven") // ist er von NexGen ?
{
printf("Der Prozessor ist von NexGen.", 2, 0xA);  // Gebe "Der prozessor ist von NexGen" aus
}
else if (EBX == "Geod" && EDX == "e by" && ECX == " NSC") // ist er von National Semiconductor ?
{
printf("Der Prozessor ist von National Semiconductor.", 2, 0xA);  // Gebe "Der prozessor ist von National Semiconductor " aus
}
else if (EBX == "Rise" && EDX == "Rise" && ECX == "Rise") // ist er von Rise?
{
printf("Der Prozessor ist von Rise.", 2, 0xA);  // Gebe "Der prozessor ist von Rise" aus
}
else if (EBX == "SiS " && EDX == "SiS " && ECX == "SiS ") // ist er von SiS?
{
printf("Der Prozessor ist von SiS.", 2, 0xA);  // Gebe "Der prozessor ist von SiS" aus
}
else if (EBX == "Genu" && EDX == "ineT" && ECX == "Mx86") // ist er von Transmeta?
{
printf("Der Prozessor ist von Transmeta.", 2, 0xA);  // Gebe "Der prozessor ist von Transmeta" aus
}
else if (EBX == "UMC " && EDX == "UMC " && ECX == "UMC ") // ist er von UMC?
{
printf("Der Prozessor ist von UMC.", 2, 0xA);  // Gebe "Der prozessor ist von UMC" aus
}
else if (EBX == "VIA " && EDX == "VIA " && ECX == "VIA ") // ist er von VIA?
{
printf("Der Prozessor ist von VIA.", 2, 0xA);  // Gebe "Der prozessor ist von VIA" aus
}
}
else
{
printf("Es ist ein Fehler aufgetreten..", 2, 0xA); // ein Fehler ist aufgetreten.
}
}
Trotzdem kann ich es nicht compilieren.
cpuid.c:93: error: comparison between pointer and integer
cpuid.c:93: error: comparison with string literal results in unspecified behavior

Wisst ihr vileicht woran das liegt??

Programm Noob

Programm Noob

  • Gast
Gespeichert
« Antwort #12 am: 20. November 2009, 00:45 »
So dan großer Hilfe von JanDing ausm IRC habe ich jetzt fast alle fehler beseitigen können. Doch ein neuer ist aufgetaucht den ich nicht weg bekomme:
cpuid.c:19: error expected ´(´ before ´:´ token
Mein Jetztiger Code ist der:
#include ".\include\video.h"

/**
 * cpuid_check prüft, ob cpuid auf diesem PC funktioniert,
 * wenn nicht dann als rückgabewert eine 0,
 * wenn ja dann als rückgabewert eine 1
 * und wenn es nicht überprüft erden kann ob nun ja oder nein eine 3.
 */
int cpuid_check()
{
int EAX;
char ECX;
__asm__("pushfd" : "pushfd" : "pop ecx" : "mov eax, ecx" : "xor eax, 0x200000" : "push eax" : "popfd" : "pushfd" : "pop eax" : "=a"(EAX), "=c"(ECX));
if (EAX == ECX)
{
return 0;
}
else
{
return 1;
}
}

/**
 * cpuid ruft die cpuid funktion des Prozessors auf und vergleicht
 * die Vendor-ID mit gespeichteten werten und gibt den Prozessorhersteller Namen aus.
 */
void cpuid()
{
unsigned int EAX, EBX, ECX, EDX;
int cpuid_check_ret;

cpuid_check_ret = cpuid_check();

if (cpuid_check_ret == 0)
{
//gebe Meldung aus, dass CPUID nicht unterstützt wird!
}
else if (cpuid_check_ret == 1) // führe CPUID aus.
{
__asm__("cpuid" : "=a"(EAX), "=b"(EBX), "=c"(ECX), "=d"(EDX) : "a"(0x00000000));

if (EBX == 0x68747541 && EDX == 0x69746D65 && ECX == 0x444D4163) // ist er von AMD?
{
printf("Der Prozessor ist von AMD.", 2, 0xA); // Gebe "Der prozessor ist von AMD" aus
}
/*else if (EBX == "Cent" && EDX == "aurH" && ECX == "auls") // ist er von Centaur?
{
printf("Der Prozessor ist von Centaur.", 2, 0xA); // Gebe "Der prozessor ist von Centaur" aus
}
else if (EBX == "Cyri" && EDX == "xIns" && ECX == "tead") // ist er von Cyrix?
{
printf("Der Prozessor ist von Cyrix.", 2, 0xA); // Gebe "Der prozessor ist von Cyrix" aus
}*/
else if (EBX == 0x756E6547 && EDX == 0x49656E65 && ECX == 0x6C65746E) // ist er von Intel?
{
printf("Der Prozessor ist von Intel.", 2, 0xA);  // Gebe "Der prozessor ist von Intel" aus
}
/*else if (EBX == "NexG" && EDX == "enDr" && ECX == "iven") // ist er von NexGen ?
{
printf("Der Prozessor ist von NexGen.", 2, 0xA);  // Gebe "Der prozessor ist von NexGen" aus
}
else if (EBX == "Geod" && EDX == "e by" && ECX == " NSC") // ist er von National Semiconductor ?
{
printf("Der Prozessor ist von National Semiconductor.", 2, 0xA);  // Gebe "Der prozessor ist von National Semiconductor " aus
}
else if (EBX == "Rise" && EDX == "Rise" && ECX == "Rise") // ist er von Rise?
{
printf("Der Prozessor ist von Rise.", 2, 0xA);  // Gebe "Der prozessor ist von Rise" aus
}
else if (EBX == "SiS " && EDX == "SiS " && ECX == "SiS ") // ist er von SiS?
{
printf("Der Prozessor ist von SiS.", 2, 0xA);  // Gebe "Der prozessor ist von SiS" aus
}
else if (EBX == "Genu" && EDX == "ineT" && ECX == "Mx86") // ist er von Transmeta?
{
printf("Der Prozessor ist von Transmeta.", 2, 0xA);  // Gebe "Der prozessor ist von Transmeta" aus
}
else if (EBX == "UMC " && EDX == "UMC " && ECX == "UMC ") // ist er von UMC?
{
printf("Der Prozessor ist von UMC.", 2, 0xA);  // Gebe "Der prozessor ist von UMC" aus
}
else if (EBX == "VIA " && EDX == "VIA " && ECX == "VIA ") // ist er von VIA?
{
printf("Der Prozessor ist von VIA.", 2, 0xA);  // Gebe "Der prozessor ist von VIA" aus
}*/
}
else
{
printf("Es ist ein Fehler aufgetreten..", 2, 0xA); // ein Fehler ist aufgetreten.
}
}

Wisst ihr was gcc von mir möchte :?

Programm Noob

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #13 am: 20. November 2009, 08:03 »
Wenn mich nicht alles täuscht, dürfte dein Fehler beim Inline Assembler sein, quasi hier:
__asm__("pushfd" : "pushfd" : "pop ecx" : "mov eax, ecx" : "xor eax, 0x200000" : "push eax" : "popfd" : "pushfd" : "pop eax" : "=a"(EAX), "=c"(ECX));
Wenn du mehrere Assembleranweisungen aneinander hängen möchtest, dann geht das so nicht. Was möglcih wäre, wäre ein Konstrukt der folgenden Art:
__asm__("pushfd; pushfd; pop ecx ..." : "=a"(EAX), "=c"(ECX));
// Alternativ auch so:
__asm__("pushfd\npushfd\npop ecx ..." : "=a"(EAX), "=c"(ECX));
Die Instruktionen müssen also entweder per Semikolon oder per Newline von einander getrennt werden...

Programm Noob

  • Gast
Gespeichert
« Antwort #14 am: 20. November 2009, 08:54 »
Moin

Ich habe zwar den Code gerade nicht da, aber das mit dem inline-Assembler klingt mir Logisch.
Ich melde mich nacher

Programm Noob

Programm Noob

  • Gast
Gespeichert
« Antwort #15 am: 20. November 2009, 14:55 »
Habe es geradde ausprobiert der Fehler ist der gleiche.

Programm Noob

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 20. November 2009, 16:00 »
es könnte nützlich sein wenn du die fehlerhafte Zeile mal markierst. Zeile 19 in deinem geposteten Code enthält nämlich überhaupt gar keinen ':'.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Programm Noob

  • Gast
Gespeichert
« Antwort #17 am: 20. November 2009, 17:01 »
Die fehlerhafte Zeile 19 ist bei mir folgende:
__asm__("pushfd" : "pushfd" : "pop ecx" : "mov eax, ecx" : "xor eax, 0x200000" : "push eax" : "popfd" : "pushfd" : "pop eax" : "=a"(EAX), "=c"(ECX));Es fehlt ganz am anfang ein Komentar für doxygen, der aber unwichtig ist.

Programm Noob

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #18 am: 20. November 2009, 17:38 »
Und diese Zeile müsste eben
__asm__ __volatile__ ("pushfd; pushfd; pop ecx; mov eax, ecx; xor eax,0x200000; push eax; popfd; pushfd; pop eax; popfd" : "=a"(EAX), "=c"(ECX));lauten. Wobei man das __volatile__ wohl auch weglassen kann, aber ich mache es aus Gewohnheit eben immer hin.

Programm Noob

  • Gast
Gespeichert
« Antwort #19 am: 20. November 2009, 18:56 »
Wenn ich die Zeile ersetze , dann erhalte ich folgende Fehler:
C:\Users\PROGRA~1\AppData\Local\Temp\ccGKNcnp.s: Assembler messages:
C:\Users\PROGRA~1\AppData\Local\Temp\ccGKNcnp.s:12: Error: no such instruction:
`pushfd'
C:\Users\PROGRA~1\AppData\Local\Temp\ccGKNcnp.s:12: Error: no such instruction:
`pushfd'
C:\Users\PROGRA~1\AppData\Local\Temp\ccGKNcnp.s:12: Error: too many memory refer
ences for `mov'
C:\Users\PROGRA~1\AppData\Local\Temp\ccGKNcnp.s:12: Error: too many memory refer
ences for `xor'
C:\Users\PROGRA~1\AppData\Local\Temp\ccGKNcnp.s:12: Error: no such instruction:
`popfd'
C:\Users\PROGRA~1\AppData\Local\Temp\ccGKNcnp.s:12: Error: no such instruction:
`pushfd'
C:\Users\PROGRA~1\AppData\Local\Temp\ccGKNcnp.s:12: Error: no such instruction:
`popfd'

Kann man vielleicht gcc sagen, dass er mit nasm arbeiten soll?
weil anscheinend kennt gas die Befehle nicht.

Programm Noob

 

Einloggen