asm Block und template Argument
-
Hallo zusammen,
also ich habe folgenden Code:
void changeRegister(std::uint32_t* esp) { *(esp + 7) = 0xaabbccdd; // Set EAX } template<void* callAddr> __declspec(naked) void stackWrapper() { __asm { pushad; push esp; mov eax, dword ptr callAddr; call eax; pop eax; popad; ret; } } int main() { stackWrapper<changeRegister>(); }Die 'StackWrapper' Funktion soll ein helper sein mit der automatisch ein Codeblock erstellt wird der die Funktion die als Template Argument uebergeben wird aufruft.
Allerdings wird mit Visual Stduio 2015 folgender Code erzeugt (kopiert bei der Ausfuehrung im Dissassembly Fenster):; stackWrapper ; __asm { pushad; ;00BD7D60 60 pushad push esp; ;00BD7D61 54 push esp mov eax, dword ptr callAddr; ;00BD7D62 A1 00 00 00 00 mov eax,dword ptr ds:[00000000h] call eax; ;00BD7D67 FF D0 call eax pop eax; ;00BD7D69 58 pop eax popad; ;00BD7D6A 61 popad ret; ;00BD7D6B C3 retWie man sieht schreibt er 0x00 in EAX statt die Funktions Addresse wie ich eigentlich dachte.
Jetzt ist die Frage warum das so ist.
Kann man Template Argumente in einem asm Block einfach nicht verwenden. Oder liegt das vielleicht an Visual Studio. Oder hab ich da einfach einen Denkfehler ?Die Addresse der Funktion ist ja beim Ubersetzten bekannt bzw kann durch eine Relocation angepasst werden.
Danke und schoene Gruesse
-
Vieleicht weil der compiler und entsprechende kommentarisierung zu der Zeit nicht wussten, dass eax diesen wert hat!?
Debug mal den code und schau dir das Register an.
-
just fad schrieb:
Vieleicht weil der compiler und entsprechende kommentarisierung zu der Zeit nicht wussten, dass eax diesen wert hat!?
Debug mal den code und schau dir das Register an.
Wie meinst du das genau ? Der oben gezeigt Assembler Block ist die Ausgabe vom "Disassembly" Fenster in Visual Studio waehrend dem debuggen. In EAX wir auch 0 reingeschrieben. Und beim "call" kommt eine read exception @ 0x00000000.