Asm in C++? Wie?



  • Guten Tag,
    bevor die Antwort kommt, ich habe schon in der FAQ geschaut und von Nubuo-T folgendenen Post gefunden :
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-47822.html
    Jedoch habe ich das nicht so ganz verstanden und ich glaube kaum das ich soviel lesen muss, für meine kleine Frage.
    Ich benutze Code::Blocks für C++ und möchte nun einen simplen NASM Code in meinem C++ Code verwenden. Wie tue ich das ? wenn ich in C::B folgendes versuche, hat der Compiler was dagegen

    ...
    asm
    {
        mov ah, 09h
        mov dx, offset hello
        int 21h
    
        mov ah, 4ch
        int 21h
    
        hello db 'Hello !', 10d, 13d,'$'
    }
    ...
    

    Eig. sollte hier das Programm "Hello !" auf den Bildschirm schreiben, aber C::B weigert sich. Vielleicht hat jemand Rat.

    Mit freundlichen Grüßen : FreakY



  • Was sagt denn C::B genau, wie sieht die Fehlermeldung aus, welchen Compiler verwendest Du, wie sieht dein Makefile aus (wenn es eins gibt) etc...



  • Code::Blocks sagt noch nicht viel über den Compiler aus, welchen du verwendest. Darum kann ich dir auch nicht sagen, was an deinem Assembly-Listing nicht stimmt, wenn dein Compiler es nicht annimmt. Ganz davon abgsehen versuchst du scheinbar per Interrupt Text auszugeben (Interrupt 21h, Function 09h)? Moderne Betriebssysteme lassen sowas gar nicht zu, und wenn du nicht gerade für 16 Bit kompilierst kommst du mit deinen Interrupts nicht allzu weit 😉

    MfG



  • Wenn wir schon dabei sind: Richtiger waere, wenn er nicht gerade fuer DOS kompiliert, kommt er damit nicht weit. :p
    Sonst wurde so weit schon alles gesagt, nur noch eine Ergaenzung: Mit diesem Assembler-Code muesstest du dem NASM irgendwie klar machen, dass es sich bei deinem Listing um TASM-Code handelt, sonst wird das nichts. Oder schreibe halt gleich NASM-code.



  • Sonst wurde so weit schon alles gesagt

    Denkste ...

    C:B nutzt die AT & T Syntax bei Assembler. Mit den Schluesselwoerter 'code blocks asm' bei google erhaelts du diese Information mit dem ersten Link. (Ja, das ist Kritik!)



  • knivil schrieb:

    Sonst wurde so weit schon alles gesagt

    Denkste ...

    C:B nutzt die AT & T Syntax bei Assembler. Mit den Schluesselwoerter 'code blocks asm' bei google erhaelts du diese Information mit dem ersten Link. (Ja, das ist Kritik!)

    ... Wen oder was willst du eigentlich kritisieren...? 😃

    /rant/ schrieb:

    Code::Blocks sagt noch nicht viel über den Compiler aus, welchen du verwendest.

    http://www.html.de/c-c-c-java-visual-basic/14362-c-code-blocks-assembler-syntax.html#post123045 (1. google Ergebnis, 2. Beitrag)

    http://www.codeblocks.org/

    und last but not least:
    FAIL (scnr 🤡 )



  • int main()
    {
        asm("mov ah, 09h");
        asm("mov dx, offset hello");
        asm("int 21h");
        asm("mov ah, 4ch");
        asm("int 21h");
        asm("hello db 'Hello!', 10d, 13d,'$'");
    }
    

    ...

    Error: too many memory references for mov' Error: too many memory references formov'
    Error: junk h' after expression Error: suffix or operands invalid forint'
    Error: too many memory references for mov' Error: junkh' after expression
    Error: suffix or operands invalid for int' Error: no such instruction:hello db 72ello!4410d,13d,36'
    === Build finished: 8 errors, 0 warnings ===



  • Stellst du dich doof?
    Hier wurde dir deutlich gesagt, dass das mit den DosInterrupts
    nix wird!
    Änder dein Programm. 👎

    MfG Jonas 🙂



  • Genau genommen wurde das so nicht explizit gesagt, weil die Details, die der OP hier bisher preisgegeben hat, doch sehr mager ausgefallen sind...

    Bei der Fuelle von Fehlermeldungen sieht mir das auch eher danach aus, dass die Sache mit den Interrupts erstmal sein geringstes Problem ist.
    Ich kenne mich mit C::B auch nicht aus und Fragen zur Konfiguration dieser IDE allein waeren hier auch deplatziert.

    Bis FreakY<3Cpp uns also darueber aufklaert, wie er seinen "C++"-Code genau compiliert (siehe 2. Beitrag), kann man zu diesem Thema auch einfach nichts weiter konkretes sagen.



  • Probier mal dies aus:
    http://www.henkessoft.de/C++/Cpp_school/asm.htm

    Im Programm findest Du die AT&T-Syntax, die von code::blocks verwendet wird:

    __asm("mov _b, %eax"); //AT&T Syntax 
    __asm("mov _a, %ebx");
    __asm("mov %eax, _a");
    __asm("mov %ebx, _b");
    

    ... die man mit etwas Geschick in die Intel-Syntax umwandeln kann:

    _asm
    {
       mov eax, b
       mov ebx, a
       mov a, eax     
       mov b, ebx
    }
    

    Programm mit code::blocks getestet, läuft erfolgreich:

    #include <iostream>
    #include <conio.h> //nur fuer Windows
    using std::cout;
    using std::endl;
    
    //globale Variablen
    int a = 1;
    int b = 2;
    
    void ausgabe()
    {
        cout << &a << ": " << a << "\t " << &b << ": " << b  << endl << endl;
    }
    
    void erfolgloser_swap( int x, int y )
    {
      cout << "Kopien auf dem Stack: " << endl;
      cout << &x << ": " << x << "\t " << &y << ": " << y << endl;
    
      int temp = x;
      x = y;
      y = temp;
    
      cout << &x << ": " << x << "\t " << &y << ": " << y << endl;
      cout << "swap nur lokal erfolgreich." << endl;
    }
    
    void zeiger_swap( int * x, int * y ) // C-Lösung
    {
      int temp = *x; // Inhalts-Operator // Dereferenzierungs-Operator
      *x = *y;
      *y = temp;
    }
    
    void referenzen_swap( int & x, int & y ) // C++-Lösung
    {
      int temp = x;
      x = y;
      y = temp;
    }
    
    int main()
    {
        cout << "Ausgangssituation: " << endl;
        ausgabe();
    
        cout << "Tausch mittels std::swap(x,y): " << endl;
        std::swap(a,b); // Methode der Wahl aus der STL
        ausgabe();
    
        cout << "Tausch mittels Zeiger: " << endl;
        zeiger_swap(&a, &b);
        ausgabe();
    
        cout << "Tausch mittels Referenzen: " << endl;
        referenzen_swap(a,b);
        ausgabe();
    
        cout << "Erfolgloser Tausch, da nur lokale Kopien getauscht werden." << endl;
        erfolgloser_swap(a,b);
        ausgabe();
    
        cout << "Tausch von a und b mittels Register eax und ebx: " << endl;
        //swap (a,b)
        __asm("mov _b, %eax"); //AT&T Syntax bei Dev-C++ und code::blocks
        __asm("mov _a, %ebx");
        __asm("mov %eax, _a");
        __asm("mov %ebx, _b");
        ausgabe();
    
        getch(); //nur fuer Windows
    }
    

    output:

    Ausgangssituation:
    0x442000: 1 0x442004: 2

    Tausch mittels std::swap(x,y):
    0x442000: 2 0x442004: 1

    Tausch mittels Zeiger:
    0x442000: 1 0x442004: 2

    Tausch mittels Referenzen:
    0x442000: 2 0x442004: 1

    Erfolgloser Tausch, da nur lokale Kopien getauscht werden.
    Kopien auf dem Stack:
    0x22ff50: 2 0x22ff54: 1
    0x22ff50: 1 0x22ff54: 2
    swap nur lokal erfolgreich.
    0x442000: 2 0x442004: 1

    Tausch von a und b mittels Register eax und ebx:
    0x442000: 1 0x442004: 2

    Weiß jemand, ob und wie man AT&T- und Intel-Syntax bei code::blocks umschalten kann?


Anmelden zum Antworten