inline assembler mit Borland compiller



  • Hallo,

    ich verwende den Borland compiller Version 5.5
    Den habe ich auf C:\Borland installiert.
    Nun habe ich folgendes kleines Programm geschrieben:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int a=5;    //integer var. a=5
        int b=6;    //integer var. b=6
        int c;      //integer var. c
    
        asm add c, a           //Benutze asm...
        asm add c, b           //Benutze asm...
    
        cout<<c<<endl<<endl;   //Ausgabe...
    
        system("pause");       //warten...
    
        return 0;
    }
    

    ich der Eingabeaufforderung von Win habe ich dann folgendes Eingegeben:

    bcc32.exe -Ic:\borland\bcc55\include -Lc:\borland\bcc55\lib c:\borland\code\asm.cpp
    

    (Habe das Programm als asm.cpp im Ordner "Code" abgespeichert)
    Nun drück' ich Enter und erhalte folgenden Fehler:

    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    c:\borland\code\asm.cpp:
    Warning W8002 c:\borland\code\asm.cpp 10: Restarting compile using assembly in function main()
    Turbo Assembler  Version 5.3  Copyright (c) 1988, 2000 Inprise Corporation
    
    Assembling file:   asm.ASM
    **Error** asm.ASM(31) Illegal memory reference
    **Error** asm.ASM(32) Illegal memory reference
    Error messages:    2
    Warning messages:  None
    Passes:            1
    

    Wo liegt der Fehler? ich verstehe das nicht, wenn ich da statt a,b oder c z.B. ax hinschreibe geht es, nun möchte ich aber in meinem Programm die C++-Variablen (a,b,c) im asm verwenden.
    Ich weiß, dass ich das auch ohne asm machen könnte, aber dies war als Übung gedach, aber nun komme ich nicht weiter.

    Grüße...



  • So habs jetzt doch hinbekommen..... muss man da die Register verwenden?

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int a=5;    //integer var. a=5
        int b=6;    //integer var. b=6
        int c;   //integer var. c
    
        asm { mov ecx, a           //Benutze asm...
              mov eax, b
              add ecx, eax
              mov c, ecx
            }
    
        cout<<c<<endl<<endl;   //Ausgabe...
    
        system("pause");                //warten...
    
        return 0;
    }
    

    So gehts jedenfalls

    Gruß



  • Hi,

    'add' geht auf jeden Fall auch mit Speicheradressen.
    Was ist denn, wenbn du c=0 setzt. Vielleicht reserviert der Kompiler sonst keinen Platz, weil c nicht gebraucht wird.
    Oder muss die Syntax vielleicht so

    add [a], b
    

    heissen?
    Also die Adressen von a als Source?

    Probier mal aus.



  • also, folgendes geht nicht:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int a=5;    //integer var. a=5
        int b=6;    //integer var. b=6
        int c=0;    //integer var. c=0
    
                    //asm...
        asm add [c], a
        asm add [c], b
    
        cout<<c<<endl<<endl;   //Ausgabe...
    
        system("pause");       //warten...
    
        return 0;
    }
    

    Da kommt diese Fehlermeldung:

    C:\Borland\BCC55\Bin>bcc32 -Ic:\borland\bcc55\include -Lc:\borland\bcc55\lib -nc:\borland\code c:\borland\code\asm.cpp
    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
    c:\borland\code\asm.cpp:
    Warning W8002 c:\borland\code\asm.cpp 11: Restarting compile using assembly in function main()
    Turbo Assembler Version 5.3 Copyright (c) 1988, 2000 Inprise Corporation

    Assembling file: c:\borland\code\asm.ASM to C:\BORLAND\CODE\asm.obj
    **Error** c:\borland\code\asm.ASM(33) Illegal memory reference
    **Error** c:\borland\code\asm.ASM(34) Illegal memory reference
    Error messages: 2
    Warning messages: None
    Passes: 1

    dann kann ich wohl nur die Register (z.B. eax) mit dem add-Befehl verwenden?

    Gruß


Anmelden zum Antworten