Inline Assembler Problem
-
Hi Leute,
ich wollte mal etwas mit Inline Assembler rumspielen, aber leider klappt das ganze nicht so wie ich es mir gehofft habe :(.Bspl:
int erg = 0; asm("movl _erg, %eax");Wenn ich das jetzt übersetzen möchte kommt der Fehler:
undefined reference to 'erg'
Aber warum nur? Laut dieser Seite( http://la.kmv.ru/rmiyagi-inline-asm.txt) sollte das funktionieren.
Als Compiler die GCC
Danke für eure Hilfe
Gruß Pingu-Group
-
Pingu-Group schrieb:
Bspl:
int erg = 0; asm("movl _erg, %eax");So ich bins nochmal.
Jetzt weiss ich schon mal warum das hier nicht Funktioniert.Liegt dran das "_erg" eine globale Variable sein muss.
Jetzt aber meine nächste frage:wie realisiere ich das dann mit einer lokalen Variable?
Über den esp bzw ebp!? Aber wie genau?
Danke für jeden vorschlag
Gruß Pingu-Group
-
der stack wächst ja bekanntlich nach unten d.h.
wenn du eine funktion aufrufst, ist die erste lokale variable
ebp - sizeof(variable)vorrausgesetzt dass der compiler intern nicht nach dem funktionsaufruf
nochmehr variablen pusht/----\ |ret | // rücksprungaddresse |----| |ebp | // alter ebp, neuer ebp zeigt hierrauf |----| |var | // ebp - sizeof(var) |----| |var2| // ebp - sizeof(var) - sizeof(var2) \----/so etwa müsste das aussehen
dummerweise pushen viele compiler alle anderen register weshalb die addressierung nicht klappt
-
http://www.ibm.com/developerworks/library/l-ia.html
so ungefähr müsste das ausschauen:
__asm__("movl %0, %%eax" : : "0"(erg) : "%eax" );
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Assembler verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
rüdiger schrieb:
http://www.ibm.com/developerworks/library/l-ia.html
so ungefähr müsste das ausschauen:
__asm__("movl %0, %%eax" : : "0"(erg) : "%eax" );Danke für den Link.
So wie du es hier beschrieben hast kommt der Fehler:matching constraint references invalid operand number
Ich hab das jetzt dann mal so gemacht:
asm("" : : "a"(erg));Das funktioniert wunderbar
.Danke für die Hilfe.
Grüße & schönen Tag noch Pingu-Group