rückgabewerte
-
hi,
habe angefangen mich mit assembler zu beschäftigen und eine frage.
wie gebe ich einen funktionswert zurück?int Addiere(int a, int b) { return (a + b); }
-
Rückgabewerte befinden sich in der Regel in (E)AX, (E)AX:(E)DX oder ST(0). Je nach Art des Wertes.
-
hm... also müsste es ungefähr so aussehen?
int Addiere(int a, int b) { asm { mov eax, a add eax, b ret } }
-
es gibt zwei pitfalls, und an beiden ist dein "ret" schuld
1. wenn dein compiler auf die idee kommt, den funktionsbody zu inlinen, passieren ganz schreckliche dinge.
2. funktionen müssen manche register nachdem sie fertig sind, wiederherstellen. das passiert im funktions pro/epilog. mit deinem "ret" überspringst du aber den epilog, sodass die entsprechenden register keine legalen werte mehr haben.
-
also das 'ret' einfach weglassen und damit hat sich es?
-
ja
-
oder die funktion mit __declspec( naked ) deklarieren.
ich schätz aber mal, dass das nur der MS compiler unterstützt.