NASM beklagt sich beim übersetzen eines Codes in ASM
-
smiley.asm:
.MODEL SMALL .STACK 200H ; .CODE START: mov ah, 2 mov dl, 1 int 21h mov ah, 4ch mov al, 00h int 21h END START
nasm schrieb:
smiley.asm:1: error; attempt to define local label before any non-local labels
smiley.asm:1: error: parser: instruction expected
smiley.asm:2: error: attempt to define a local label before any non-local labelssmiley.asm:2: error: parser: instruction expected
smiley.asm:3: error: attempt to define a local label before any non-local labelssmiley.asm:14: error: parser: instruction expected
http://doorknobsoft.com/tutorial/asm-tutorial-learning-assembly/
Ich versuche gerade die Assemblersprache zu erlernen (mit dem Tut. oben!) und habe schon beim ersten Start versagt ein lauffähiges Assemblerprogramm zu erstellen.
Was ist in meinem Code falsch?"define a local label" was für eine Lokale Marke denn eine Sprungmarke?
"instruction expected" Befehl erwartet also Befehl fehlt oder?Ich kann damit nichts anfangen
Bitte helft mir!
-
Das Tutorial ist halt für TASM geschrieben. NASM hat da ein paar Unterschiede ( http://www.nasm.us/doc/nasmdoc2.html#section-2.2 ).
-
Scheint so, als wuerde der Autor dort auf TASM setzen, wohingegen du NASM nutzt. Da kann sowas schon mal vorkommen. Imho sehr nervig, das da jeder so ein wenig sein eigenes Sueppchen kocht. Deswegen (und weil jede Architektur andere Befehle usw. hat) ist es auch schwierig von "der Assemblersprache" zu sprechen.
Lange Rede kurzer Sinn: such Dir nen NASM Tutorial.
-
...oder versuche zumindest erstmal, den TASM-Kompatibilitaetsmodus beim NASM ein zu schalten. Blick in die Parameteruebersicht mit /? und die Docu hilft.
Ich weiss allerdings nicht, ob der nur den "echten" TASM-"IDEAL"-Modus unterstuetzt oder auch MASM-Code.
Dein Code sieht mir naemlich genau genommen auch nicht wie TASM- sondern mehr wie MASM-Code aus.Auf NASM ausgelegte, gute Anfaengertutorials sind ziemlich rar... Falls gar nichts geht, koennte also auch ein Versuch mit einer 16Bit-Version des MASM was bringen.
-
Assembling: C:\masmPJ\first.asm C:\masmPJ\first.asm(9) : error A2004: symbol type conflict C:\masmPJ\first.asm(19) : warning A4023: with /coff switch, leading underscore required for start address : main Volume in Laufwerk C: hat keine Bezeichnung. Volumeseriennummer: 3074-3647 Verzeichnis von C:\masmPJ 22.08.2009 22:50 267 first.asm 1 Datei(en) 267 Bytes 0 Verzeichnis(se), 9.011.888.128 Bytes frei
.model small .stack .data message db "Hello world, I'm learning Assembly !!!", "$" .code main proc mov ax,seg message mov ds,ax mov ah,09 lea dx,message int 21h mov ax,4c00h int 21h main endp end main
Ich verwende jetzt nicht mehr NASM (auch nicht mehr C ;)) sondern MASM den Makro Assembler von Microsoft und dieser meldet mir 2 Fehler die ich im moment nicht begreifen kann. Ich verwende übrigens diesmal ein anderes Tutorial (s. u.):
-
Wie rufst du den Assembler auf? Aus Microsofts IDE heraus wird das mehreren Quellen zufolge nicht funktionieren. Probiere also mal direkt ueber die Konsole ml aufzurufen, evtl. mit dem switch /c dazu.
Falls es noch immer mit Zeile 9 Probleme gibt, kannst du "seg message" mal durch "@data" ersetzen (holt allgemein die Segmentadresse des Datensegments).
Die Warnung kannst du ignorieren, oder ihm den Gefallen tun, einen "_" vor dein Einstiegslabel zu packen (also immer "_main" schreiben).
-
Das "_" vor main gesetzt, seg message durch @data ersetzt und trotzdem kommt eine Fehlermeldung:
9 - error A2006: undefined symbol : DGROUP
und ein warning, aber das kann ich ja ignorieren.
Grüße
agi
-
Nobuo T schrieb:
Wie rufst du den Assembler auf?
Bitte mal detailliert beschreiben.
-
Nobuo T schrieb:
Nobuo T schrieb:
Wie rufst du den Assembler auf?
Bitte mal detailliert beschreiben.
Mit der IDE (da wird ja auch eine Konsole aufgerufen) und anders weis ich nicht wie.
-
Nobuo T schrieb:
Aus Microsofts IDE heraus wird das mehreren Quellen zufolge nicht funktionieren. Probiere also mal direkt ueber die Konsole ml aufzurufen, evtl. mit dem switch /c dazu.
Konsole aufmachen, in das Verzeichnis mit deinen Quellcodes wechseln und dann "ml /c first.asm" eingeben. Falls der Pfad zu ml nicht im path steht, musst du halt den kompletten pfad von ml.exe eingeben.
-
Wenn ich "ml /c first.asm" eingebe kommt folgende Meldung:
"Der Befehl "ml" ist entweder falsch geschrieben oder konnte nicht gefunden werden."
Wo soll ich den kompletten Pfad eingeben in der cmd?
edit:
Und Ml ist der linker richtig?
-
Nein. ml ist der MASM.
Ich schlage vor, bevor du dich weiter mit fortgeschrittenen Programmierthemen beschaeftigst, lernst du erstmal die Grundlagen des Umgangs mit dem Betriebssystem auf dem du arbeitest (also Windows) - genauer die wichtigsten Befehle der Konsole.Wenn du das getan hast, kannst du ja nochmal versuchen, das hier umzusetzen:
Nobuo T schrieb:
Falls der Pfad zu ml nicht im path steht, musst du halt den kompletten pfad von ml.exe eingeben.
-
woher hast du den masm? Du brauchst nämlich eine 16Bit-Linker damit die Sache überhaupt läuft.