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)
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 for
mov'
Error: junkh' after expression Error: suffix or operands invalid for
int'
Error: too many memory references formov' Error: junk
h' after expression
Error: suffix or operands invalid forint' 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.htmIm 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: 2Tausch mittels std::swap(x,y):
0x442000: 2 0x442004: 1Tausch mittels Zeiger:
0x442000: 1 0x442004: 2Tausch mittels Referenzen:
0x442000: 2 0x442004: 1Erfolgloser 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: 1Tausch von a und b mittels Register eax und ebx:
0x442000: 1 0x442004: 2Weiß jemand, ob und wie man AT&T- und Intel-Syntax bei code::blocks umschalten kann?