Autor Thema: EAX in C lesen  (Gelesen 17010 mal)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« am: 27. February 2005, 13:50 »
Hallo,
wenn ich in C wissen will, was in EAX steht, wie kann ich das machen? Und kann ich das in ne Variable kopieren?

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 27. February 2005, 14:57 »
Das geht in der Sprache C nicht. Um die Register kümmert sich der Compiler. Wenn du dennoch mit Registern arbeiten willst, musst du Inline-Assembler benutzen. Das unterscheidet sich von Compiler zu Compiler.

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 27. February 2005, 15:10 »
Ja, das mit inline-ASM is mir schon klar, ich meine, ob ich den Wert der in EAX steht in eine Variable speichern kann

Kevin_

  • Beiträge: 52
    • Profil anzeigen
    • http://fishing-online.lite-os.de
Gespeichert
« Antwort #3 am: 27. February 2005, 16:56 »
warum sollte das nicht gehen? wie das geht kommt aber auf den compilen an den du benutzt...

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 27. February 2005, 17:13 »
Oh, iich hab mich falsch ausgedrückt....
Ich hab gemeint, ob ich den Wet, der in EAX steht in eine Variable schreiben kann, die von meinem C Programm gelesen werden kann. Oder würde dieser Code gehen:

void main(void)
{
   int variable;
   _asm{mov variable, eax};
   printf ("%d,variable");
}

Kevin_

  • Beiträge: 52
    • Profil anzeigen
    • http://fishing-online.lite-os.de
Gespeichert
« Antwort #5 am: 27. February 2005, 17:20 »
Zitat von: JG
Oh, iich hab mich falsch ausgedrückt....
Ich hab gemeint, ob ich den Wet, der in EAX steht in eine Variable schreiben kann, die von meinem C Programm gelesen werden kann. Oder würde dieser Code gehen:

void main(void)
{
   int variable;
   _asm{mov variable, eax};
   printf ("%d,variable");
}


erstens: es heißt int main()!
und zweitens: kommt auf den compiler an... bei gcc kannst den code schonmal vergessen

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 27. February 2005, 17:44 »
es heisst nicht zwingend int main()
Ich lege doch selbst die mainfunktion fest und damit auch den rückgabetyp.
Ich könnte die Funktion auch kuhliehfumdenteich() nennen ^^ ist doch egal. Ich muss nur den Aufruf der Funktion entsprechend anpassen.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 27. February 2005, 18:24 »
dann eben

int main(void)
{
   int variable;
   _asm{mov variable, eax};
   printf ("%d,variable");
}

Aber gehen tut der Code, oder?

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 27. February 2005, 19:11 »
dürfte auch nich gehn,  printf hat ne falsche parameterliste ( ersetz das "%d,variable" mal mit "%d",variable )
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

Kyoko12

  • Beiträge: 59
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 27. February 2005, 20:14 »
Du kannst in inline-ASM nicht einfach C-Variablen nehmen!
Das _asm_("mov variable, eax"); kannst vergessen!

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 27. February 2005, 20:56 »
Hängt vom Compiler ab, würde ich mal sagen.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #11 am: 28. February 2005, 01:58 »
Warum willst du denn den Wert von EAX in eine Variable speichern?

Vielleicht sagst du mal was du "als ganzes" vor hast. Dann kann man dir dazu vielleicht auch ne Lösung sagen.
----------------------
Redakteur bei LowLevel

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #12 am: 28. February 2005, 11:45 »
ich nehme mal an er will es zu testzwecken ausgeben.

wie in bochs mit dump_cpu....

Ich werde diese funktionen früher oder speter auch noch coden. aber vorerst  brauche ich ne funktion die zahlen ausgeben kann ;)

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 28. February 2005, 14:06 »
Zitat von: TeeJay

Warum willst du denn den Wert von EAX in eine Variable speichern?

Vielleicht sagst du mal was du "als ganzes" vor hast. Dann kann man dir dazu vielleicht auch ne Lösung sagen.

Ich will mit deiner Funktion den Arbeitsspeicher berechnen und dann ausgeben...

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #14 am: 28. February 2005, 15:24 »
Dann ruf die Funktion doch einfach von C auf aus.
Der Rückgabewert ist immer in EAX gespeichert.
----------------------
Redakteur bei LowLevel

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 28. February 2005, 15:30 »
Achso, so meinst du das:

unsigned long GetMemSize();

unsigned long GetMemSize()
{
   _asm
   {
      _GetMemSize:
push ebp
mov ebp, esp
push eax
push edx
mov eax, 0 ;EAX ist Zähler für die MBs
mov edx, 0x1EFFFC ;EDX auf 3 Bytes vor die 2 MB Grenze setzen
.1:
inc eax
mov DWORD [edx], 0xAAAAAAAA ;0xAAAAAAAA an die Speicherstelle schreiben
mov ebx, [edx] ;Speicherstelle wieder lesen
add edx, 0x100000 ;Adresse um 1 MB erhöhen
cmp ebx, 0xAAAAAAAA ;Stimmt gelesener Wert mit dem geschriebenen überein?
je .1
pop edx
pop eax
mov esp, ebp
pop ebp
ret
   }
}
oder wie?


TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #16 am: 28. February 2005, 18:14 »
Nein.

du deklarierst:
extern UINT GetMemSize();

und dann rufst du auf:

int main()
{
  unsigned int Mem;
  Mem = GetMemSize();
}

fertig.
Musst halt sehen das die ASM-Datei zu der C-Datei hinzugelinkt wird
----------------------
Redakteur bei LowLevel

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 06. March 2005, 16:58 »
Ich hab noch ne Frage, wie übergeb ich an eine Funktion eine Variable, also keine Funktion, die einen Rückgabewert hat, sondern ich übergeb z.b. var1 und var2
ich hoffe ihr versteht was ich will

JG

  • Beiträge: 189
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 06. March 2005, 17:18 »
So, etwas genauer:
ich will out auch unter C nutzen, also muss ich ja den Port und das Register ja an meine Funktion outp() übergeben. Nur meine Variable von C kann ich ja in ASM nicht lesen...

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #19 am: 06. March 2005, 20:05 »
ca so:
unsigned char inb(unsigned int _port)
{
unsigned char result;
asm volatile ("inb  %%dx, %%al" : "=a" (result) : "d" (_port) );
return result;
};


void outb(unsigned int _port, unsigned char _value)
{
asm volatile ("outb %%al, %%dx" : : "d" (_port), "a" (_value));
};


mit "=a (result)" wird eax in result geschrieben.
mit "d (_port)" wird edx mit _port gefüllt....etc

%%=bedeuted das es ein register ist...
und zuletzt musst du hinter die befehle die grösse schreiben.. outb für byte outw für word und outd für double...

 

Einloggen