C-Funktion von Inline-Assembly callen



  • Danke für eure Antworten

    proggingmania: Danke für deine konstruktive Antwort. Würdest du verstehen was ich will würdest du nicht so einen Mist zusammen schreiben. Das nächste Mal bitte zuerst denken ob es sich lohnt einen sinnlosen Kommentar abzuliefern.

    rüdiger: Was ist daran falsch, es scheint nur die Zeile mit " << HIER " falsch zu sein, das andere ist at&t assembly.

    Und jetzt bitte, hat wer ne Ahnung?

    Danke



  • Mit dem Microsoft Compiler geht das ganz easy mit den Funktionsaufrufen:

    #include <stdio.h>
    
    void aha( )
    {
    	puts("AHA");
    }
    
    int main()
    {
    	 __asm
    	{
    		call aha;
    	}
    
    	return 0;
    }
    

    Mein Kommentar wird erst dann sinnlos, wenn du mich vom Gegenteil überzeugst. 😉



  • #include <stdio.h>
    
    char format[] = "%s %s\n";
    char what[] = "I am so bored";
    char when[] = "today";
    
    void main( void )
    {
       __asm
       {
          mov  eax, offset when
          push eax
          mov  eax, offset what
          push eax
          mov  eax, offset format
          push eax
          call printf
          pop  ebx
          pop  ebx
          pop  ebx
       }
    }
    

    🙂



  • #include <stdio.h>
    
    char format[] = "%s %s\n";
    char what[] = "I am so bored";
    char when[] = "today";
    
    int main()
    {
       __asm
       {
          push offset when
          push offset what
          push offset format
          call printf
          add  esp, 12
       }
    
    }
    

    🕶



  • TheAsmN00b schrieb:

    rüdiger: Was ist daran falsch, es scheint nur die Zeile mit " << HIER " falsch zu sein, das andere ist at&t assembly.

    __asm("call WriteMe"); // << Hier
    

    das müsste glaube ich so aussehen. Bin mir aber nicht sicher

    __asm__ __volatile__ ("call %1" : : "1"(WriteMe) :);
    

    siehe hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-41479.html

    @others
    was ihr postet ist sinnlos, da er nicht den MSVC nutzt...



  • Dieser Thread wurde von Moderator/in Tim 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.



  • Hmmm.... das klappt auch nicht, leider. Kann mir wer sonst helfen?

    gruss TheAsmN00b



  • vielleicht muss die Adresse relativ sein für call. Aber wie gesagt, schau einfach mal in die zahlreichen Links, die in der FAQ stehen (siehe die beiden Links von mir...)



  • Ich habe jetzt alles durchgeschaut und fand nichts. Hat jemand eine Idee?
    danke



  • Probier's mal so:

    void foo() {
     printf("bar\n");
    }
    //...
     __asm__ __volatile__("call *%0\n"::"r"(foo));
    


  • Danke Overflow, voll geil, das hat geklappt.

    Ich möchte gerne den ganzen Source posten (wer weiss, vllt kann man das ins Faq für andere Personen verschieben):

    /* 
       IDE: Dev-C++ 4.9.9.2
       Compiler: MinGW (version unkown) [gcc for win32]   
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    int change(void *address, int wb)
    {
      HANDLE h=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,1, GetCurrentProcessId());
      return WriteProcessMemory(h, address, &wb, 1, NULL);
    }
    
    int main(int argc, char* argv[])
    {
            asm("pushl $0x74");
            asm("pushl $Here");
            __asm__ __volatile__("call *%0\n"::"r"(change));      
            asm("addl $8, %esp"); 
            asm("Here: jmp Here");
    
            printf("The JMP was now changed to JZ ;-)\n");
            system("pause");
            return 0;
    }
    

    Danke für die Hilfe.

    Viel Spass, AsmNoob


Anmelden zum Antworten