error A2004: symbol type conflict



  • Nikolai schrieb:

    Was ist jetzt mit den anderen Beispielen im Buch? Brauch ich für sämtlichen Code einen Emulator? Und wie installiert man auf DOS box den ASM compiler?

    Den brauchst du nicht groß installieren, einfach in ein Verzeichnis packen, dann Verzeichnis anwählen und von dort aus (Konsole) direkt loslegen, normalerweise wie im Backerbuch beschrieben, oder eben wie in der jeweiligen Assembleranleitung beschrieben.



  • Nikolai schrieb:

    Ich hab das gleiche Problem wie in dem thread, ich versuche ein Testprogramm aus dem assembler Buch zum laufen zu bringen, aber es kommt immer nur die Meldung: "error A2004: symbol type conflict" bei der Zeile

    Anfang:	mov ax,DATEN
    

    . Einige Antworten besagen dass es sich um ein 16 bit Programm handelt und es deswegen nicht geht, obwohl ich nirgends am code erkennen kann dass es so ist. Das Programm das in dem Thread verlinkt wurde lässt sich bei mir nicht starten, ist nicht kompatibel mit meiner Windwos Version.

    Hallo,

    ich habe mir Virtual PC installiert und darauf mein (erstes) Win98SE...
    Der Bootvorgang dauert keine 15s und kaputt machen kann man auch nichts..

    Gruß Nicky



  • 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 .exe

    Nicky



  • 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.


Anmelden zum Antworten