Funktionsaufruf will nicht klappen
-
hi,
also ich bin noch relativ neu in der welt des assembly, deswegen hoffe ich mal, dass ich hier nicht vor einem ganz dummen leichtsinnsfehler stehe. naja hier erstmal der code:#include <iostream> void copy ( const int source, int& destination ) { asm ( "movl %1, %0" : "=r" ( destination ) : "r" ( source ) ); }; int main () { int i = 12, j = 3; asm ( "#call copy %1, %0" : "=r" ( j ) : "r" ( i ) ); std::cout << "i: " << i << '\n' << "j: " << j; std::cin.get (); return 0; };
wenn ich das inline assembly in main mit "copy ( i, j );" ersetzt steht auch 12 in j; also muss copy ja zumindest noch funktionieren
nur ich google jetzt schon stundenlang rum, aber ich finde nichts, dass mir auf die spruenge hilft, den fehler zu finden.ich hoffe mal jemand von euch kann mir helfen.was auch immer
-
Destination ist eine Adresse, du müsstest also schreiben:
movl %1,0(%0)
EDIT: Dann ist Destination aber wohl keine Ausgangsvariable mehr, und du müsstest wohl "memory" zu den clobbers dazunehmen.
-
sorry, aber das klappt auch nicht. die copy funktion muesste doch so stimmen, oder? weil wenn ich sie ohne inline asm aufrufe, geht ja alles wunderbar. mir ist noch aufgefallen, dass in j immer, und ich meine immer, egal wie oft ich den rechner neu starte oder sonst was mache, 4009608 steht. ist das jetzt ein riesen zufall oder ist das ne bestimmte nummer? woran koennte es noch liegen?
was auch immer
-
Hast recht. Ich habe gedacht, dass Referenzen genauso behandelt werden wie Zeiger. Es kommt aber jedenfalls komischer Code raus, wenn man es so macht wie du. Ich würde trotzdem meine Variante verwenden und aus der Referenz einen Zeiger machen. Wenn copy eh funktioniert, was ist dann dein Problem?
EDIT: Um einiges besser wäre es aber noch, memory constraints zu verwenden und nicht register.
EDIT2: Achso, jetzt seh ich, was du machen willst. Schau dir halt an, was der Compiler macht, wenn du copy aufrufst (beide Argumente auf den stack pushen und nachher wieder wegräumen).
-
danke, funktioniert jetzt wunderbar. hier nochmal der code:
#include <iostream> #ifdef __cplusplus extern "C" { #endif void copy ( const int source, int destination ) { asm ( "movl %1, %0" : "=r" ( destination ) : "r" ( source ) ); }; #ifdef __cplusplus }; #endif int main () { int i = 12, j = 3; asm ( "pushl %1\n\t" "pushl %0\n\t" "call _copy" : "=r" ( j ) : "r" ( i ), "0" ( j ) ); std::cout << "i: " << i << '\n' << "j: " << j; std::cin.get (); return 0; };
zwei fragen haette ich noch:
1. warum muss ich destination mit call by value und nicht mit call by reference uebergeben, da ich bei letzterem einen segmentation fault kriege.2. wenn ich das mit dem mingw studio kompiliere gehts wunderbar, aber beim dev-cpp kommt wieder der seg-fault. aber das wirklich komische daran ist, dass beide ides auf ein und die selbe mingw installation zugreifen. woran koennte das liegen?
was auch immer