error A2004: symbol type conflict
-
Habs grad mit windows xp 32bit auf vm versucht, gleiche Fehlermeldung.
Ich hab jetzt zwar DOSbox, aber ich brauch noch einen 16bit assembler und ich muss wissen wie man überhaupt was in DOSbox kopiert.
-
Nikolai schrieb:
Habs grad mit windows xp 32bit auf vm versucht, gleiche Fehlermeldung.
Ich hab jetzt zwar DOSbox, aber ich brauch noch einen 16bit assembler und ich muss wissen wie man überhaupt was in DOSbox kopiert.Hallo Nikolai,
Zeige doch mal deinen Quelltext und die Compileranweisung mit der du das Programm erstellst...
.MODEL TINY .CODE ORG 100h start: mov dx, offset string1 mov ax, 0900h int 21h ende: mov ax, 4C00h int 21h string1 db "Hallo Welt",10,13,"$" END start
Kompilieren mit folgender Anweisung: ml.exe /AT hallowelt.asm
hallowelt.asm ist dabei der Name der Datei (.asm)Damit wird eine 16bit .com Datei erstellt, die auch unter WinXP in der DosBox laufen sollte.
Gruß Nicky
-
hier ist der code:
DATEN SEGMENT Meldung db "test string" db "$" DATEN ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATEN Anfang: mov ax,DATEN mov ds,ax mov dx, offset Meldung mov ah,9 int 21h mov ah,4Ch int 21h CODE ENDS END Anfang
Das Buch ist von Ende 2003, und es geht nichtmal bei Windows XP 32 bit. Kann doch nicht sein dass der erste Quelltext schon nicht läuft...
-
Tu dir selbst ein Gefallen und schmeiß das Buch weg. 16Bit Einsteiger-Tutorials/Bucher haben ihre Daseinsberechtigung schon vor Jahrzehenten verloren.
Wenn du dennoch dran festhalten willst, nimm JWASM. Dieser kann dir direkt, ohne Linker, 16Bit EXEs erstellen (jwasm.exe /mz src.asm).
-
Nikolai schrieb:
hier ist der code:
DATEN SEGMENT Meldung db "test string" db "$" DATEN ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATEN Anfang: mov ax,DATEN mov ds,ax mov dx, offset Meldung mov ah,9 int 21h mov ah,4Ch int 21h CODE ENDS END Anfang
dann musst du folgendes aufrufen
ml.exe /ZM
Damit erhälst du eine 16bit .exeNicky
-
wo soll ich das aufrufen? Ich benutze Visual Studio Express 2010.
-
Nikolai schrieb:
wo soll ich das aufrufen? Ich benutze Visual Studio Express 2010.
Hallo Nikolai,
erstelle einfach eine Textdatei mit der Endung .asm, dort kopierst du den Code rein...
Erstelle dazu noch eine .bat Datei mit dem Inhalt:
ml.exe /Zm hallowelt.asm Pause
Beide Dateien (.asm und .bat) müssen im Ordner mit der ml.exe liegen!
Doppelklick auf die .bat Datei und die .exe wird erstellt...
Nicky
-
Nikolai schrieb:
wo soll ich das aufrufen? Ich benutze Visual Studio Express 2010.
Über die Konsole. Und wie in der Referenz beschrieben. Bei Visual Studio für 32Bit kompiliert ML anstandslos auch 16 Bit Code. Man kann sich den Assembler auch in ein eigenes Verzeichnis kopieren (z.B. Usb-Stick oder SD-Karte), nach dort wechseln und von da aus aufrufen. Der Assembler + Linker und Co befindet sich normalerweise im Verzeichnis
C:\Program Files\Microsoft Visual Studio xx\VC\bin.Lies dir die Aufrufhinweise in der Doku durch und probier mal ein bißchen herum, weil viele Leute hier diese Art von Fragen zum Backerbuch stellen und am korrekten Auffruf scheitern. Bei 16bit Masm reichte es zu schreiben:
masm meinproggi;
link meinproggi;
Wenn man auf exe kompiliert hat, dann im Hexeditor auf Wunsch auch leicht nach Com frisieren.Bei Visual Studio ML (Masm) sollte ein
ML meinproggi.asm genügen.
Aber was zu deinem Glück dann fehlt, wäre ein 16bit Linker.Eine gute Alternative wäre noch, sich ein Freedos zum Booten zu besorgen, und dort die Konsoletools laufen zu lassen. Für Freedos gibt es auch ein erweitertes Debug Programm von Paul Vojta http://math.berkeley.edu/~vojta/ mit dem du noch mehr über Assembler lernst, als allein mit dem Backerbuch, zumal dort die Masm Grammatik auch nicht gerade bis in alle (Un-)Tiefen besprochen wird.
Aber wie masm schon schreibt, kannst du auch Assembler nutzen, die ohne Linker assemblieren.
Mit fasm für Windows (32) geht das auch sehr einfach:
einfach in den Editor reinschreiben:org 100h ;für .com files, Einstieg bei 100h, 256ByteVorspiel überspringen mov dx,Meldung ;Adresse in DX für Interrupt21 Funktion 09, Stringausgabe ab adresse, abgeschlossen mit der Markierung 24h mov ah,09 ;(eben jene Funktion "09") int 21h :mach int 20h ; Ende Interrupt für alte Dos Programme Meldung db "Assemlergrammatiken und Compileraufrufe usw. können manchmal ganz schön nerven, dagegen ist ein einheitlich verläßlicher C-Compilieraufruf geradezu segensreich einfach",24h ;statt 24h kann man auch den ASCII-Code dafür schreiben, der ist $
oder wenn es ein Exe-Programm sein soll:
; fasm example of writing simple EXE program format MZ push cs pop ds mov ah,9 mov dx,hello int 21h mov ax,4C00h int 21h hello db 'Hello world!',24h
...und jetzt nur noch auf compilieren klicken...
-
supernicky schrieb:
ml.exe /Zm hallowelt.asm Pause
Beide Dateien (.asm und .bat) müssen im Ordner mit der ml.exe liegen!
Doppelklick auf die .bat Datei und die .exe wird erstellt...
Nicky
Hab ich gemacht, ich wusste ja nichtmal dass ml.exe der Assemlber ist, weil der Dateiname das auch nicht vermuten lässt...
jedenfalls hab ich es so gemacht wie beschrieben. ml.exe /Zm asm1.asm, es kommt der genau gleiche fehler wie in visual studio.
das untere von nachtfeuer gepostete Ding geht auch nicht, nur haufenweise A2088 errors, es muss in einem segment block sein.also hat vieleicht einer nen ganz einfachen Quelltext zum testen, damit ich es schaffe wenigstens 1 Programm zu compilen...
-
JWasm208abw.zip -> JWASM.exe in das Verzeichnis mit deinem Quellecode -> CMD -> jwasm.exe /mz deinQuellcode.asm -> deinQuellcode.EXE -> fertig (Zeitaufwand: weniger als 1 min.)
-
Nikolai schrieb:
also hat vieleicht einer nen ganz einfachen Quelltext zum testen, damit ich es schaffe wenigstens 1 Programm zu compilen...
Versuch mal das hier mit fasm (und vergiss nicht, dir das fertige Ding in einem Disassembler anzuschauen):
format pe console include 'win32ax.inc' .data _message db 'Hello World!',13,10 _message.len = $ - _message .code begin: push eax invoke GetStdHandle,STD_OUTPUT_HANDLE mov ecx,esp invoke WriteFile,eax,_message,_message.len,ecx,0 pop eax invoke ExitProcess,0 .end begin
Wenn das jetzt auch nix wird, dann würde ich empfehlen, erstmal einen etwas leichteren Weg mit C zu beginnen, und das eventuell mit einem Linux-Betriebsystem. Das hätte den Vorteil, einer netten Hackerromantik, denn/und auch python ist mit C auf einigen Linuxen vorinstalliert, und erfreut sich einer recht lebhaften Community inklusiver recht guter Einstiegstutorials mit netten Möglichkeiten.
(oder sieh wenigstens zu, das masm sich nicht dauern wiederholen muß)
-
masm schrieb:
JWasm208abw.zip -> JWASM.exe in das Verzeichnis mit deinem Quellecode -> CMD -> jwasm.exe /mz deinQuellcode.asm -> deinQuellcode.EXE -> fertig (Zeitaufwand: weniger als 1 min.)
weniger als eine Minute wenn man weis was man sich von wo beziehen muss. Mit dem Ding wird zumindest schonmal die Object Datei richtig erstellt, mit dem FASM Teil geht der Code der gepostet wurde, aber nicht der ursprüngliche. Was ist der Unterschied zwischen diesen ganzen Assemblern? Wieso gibt es überhaupt unterschiedliche?
-
Nikolai schrieb:
Was ist der Unterschied zwischen diesen ganzen Assemblern? Wieso gibt es überhaupt unterschiedliche?
Hauptsächlich die Grammatik, die Möglichkeiten, die Kompatibilitäten, die Dokumentationen, die Bugs und die Weiterpflege unterscheiden die Assembler, wie auch Beispiele/Bibliotheken und Weiterpflege oder auch geschäftliche Interessen.
Schau dir die Geschichte von Rosasm an, die Zielsetzung, die Kritiken, die Möglichkeiten und was letztlich draus geworden ist, oder auch die Zielsetzungen von anderen Assembler(compiler)programmierern.