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                   ret
    

    Wie 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.


Anmelden zum Antworten