NASM Syntax
-
Ich wer noch bekloppt.
Ich will folgende Zeile in NASM compelieren und bekomm da immer ne fehlermeldung:
ziffanz DB 1 DUP (0)
habs jetzt schon mit
ziffanz DB 1 rest 0
versucht aber auch da weigert sich mein compiler.
Wie genau muß da die deklaration in NASM ausehen?
-
Sry, aber wie waers mal mit Anleitung lesen?
-
hm das hilft mir auch nicht wirklich weiter, vielleicht sollte ich mal etwas weiter aushohlen was ich da überhaupt deklarieren will.
Ich möchte folgenden MASM Code in NASM umsetzen:
mov [ziffanz], 0h // INPUT: cmp [ziffanz], 08h // je input inc [ziffanz] // jmp INPUT ziffanz db 1 dup(0) //Bytevariable nit 0
Ich hab auch schon in das NASM tut geschaut, aber wirklich schlau bin ich daraus nicht geworden.
Ich hab schon alles mögliche Versucht um die Bytevariable in NASM zu deklarieren, wenn es mal ohne Fehlermeldung klappt, bekomm ich dann fehlermeldungen in den Zeilen wo die Variable im Programm verwendet wird.
Typische Fehlermeldungen sind:
-invalid combination of opcode and operands
-operation size not spezified
-
ah, I see.
Dann erstmal:
Um ein einziges initialisiertes Byte zu platzieren brauchst du weder DUP noch TIMES. Die dienen zum haeufigen Wiederholen eines Datums, dh. mehr als 1.Weiters haben die von dir genannten Fehler nichts mit deiner Methode zum Deklarieren der "Variable" zu tun, sondern mit dem Zugriff.
mov [ziffanz], 0h
mag zB. in MASM noch klappen, weil der Assembler so freundlich ist, deine Nachsichtigkeit kommentarlos zu akzeptieren und anzunehmen, dass du implizit ein Byte adressieren wolltest. Dem NASM musst du dagegen schon explizit mitteilen, wie gross deine Konstanten jeweils sein sollen.
zB. so:mov byte [ziffanz], 0h
-
achso und als deklaration für die byte variable reicht dann:
ziffanz db 1
?
-
Ja. Wird dann mit 1 initialisiert. In der Anleitung steht auch, wie du mehrere Daten hintereinander haengen kannst.
-
ich hab da nochmal ne frage
ich verschiebe den inhalt einer wort variabel um 1 byte nach links
ist nun
shl byte [wort], 1
oder
shl wort [wort], 1
richtig?
Mein compiler meint es wär das mit dem byte aber warum?
und warum reicht beim addieren:
add [wort], cx
edit:also bei den shift befehlen hab ich jetzt gemerkt das es word nicht byte heissen muß, weil sonst nur im lower teil der variable rumgeschoben wird.
-
Dragonslayer schrieb:
Mein compiler meint es wär das mit dem byte aber warum?[...]
edit:also bei den shift befehlen hab ich jetzt gemerkt das es word nicht byte heissen muß, weil sonst nur im lower teil der variable rumgeschoben wird.Jup, und zwar "word" und nicht "wort".
Dragonslayer schrieb:
und warum reicht beim addieren:
add [wort], cx
cx ist immer eindeutig 16Bit gross. Was anderes als "word" kann hier fuer die Adressierung also gar nicht gemeint sein, deshalb brauchst du es auch nicht extra hinschreiben.
-
Servus ich grab nochmal den Fred aus.
Brauch jetzt nen Byte Array mit 32 feldern
in MASM wär das ja
array db 32 dup (0)
Hab ich das richtigt verstanden das, das in NASM über times läuft?
array times 32 db 0
In der doku stand komischerweise hinter dem feldnamen noch nen doppelpunkt
array: times 32 db 0
[quote="Nobuo T"]
Dragonslayer schrieb:
Mein compiler meint es wär das mit dem byte aber warum?[...]
edit:also bei den shift befehlen hab ich jetzt gemerkt das es word nicht byte heissen muß, weil sonst nur im lower teil der variable rumgeschoben wird.Jup, und zwar "word" und nicht "wort".
das verdank ich nem Buch auf deutsch, da steht wirklich für word "wort" ...
-
Nobuo T schrieb:
mov [ziffanz], 0h
mag zB. in MASM noch klappen, weil der Assembler so freundlich ist, deine Nachsichtigkeit kommentarlos zu akzeptieren und anzunehmen, dass du implizit ein Byte adressieren wolltest.
was denn sonst? ist doch schließlich als byte definiert worden. Umgekehrt frag ich mich dann bei NASM, warum ich alles doppelt und dreifach sagen muss. Ein bisschen erinnert mich dass an Funktionsüberladung in C++ - bei MASM hängt eben die konkrete Bedeutung vom Typ der Operanden ab, während man bei NASM immer explizit sein muss, ähnlich wie man in C eben für jede Variante einen anderen Funktionsnamen wählen muss. Das ist aber eine entfernte Analogie.
Und nein, ich will damit keine Diskussion starten - letztlich sind beide Assembler mehr oder minder unbrauchbar.
Dragonslayer schrieb:
In der doku stand komischerweise hinter dem feldnamen noch nen doppelpunkt
array: times 32 db 0
nasm macht keinen Unterschied zwischen Variablen und Labels - deshalb kannst du es dort so oder so machen.
-
camper schrieb:
Nobuo T schrieb:
mov [ziffanz], 0h
mag zB. in MASM noch klappen, weil der Assembler so freundlich ist, deine Nachsichtigkeit kommentarlos zu akzeptieren und anzunehmen, dass du implizit ein Byte adressieren wolltest.
was denn sonst? ist doch schließlich als byte definiert worden. Umgekehrt frag ich mich dann bei NASM, warum ich alles doppelt und dreifach sagen muss.
Naja, ich finde den Ansatz von NASM, Labels und Variablen gleich zu behandeln (und somit auch keine solchen "Definitionen" zu uebernehmen) eigentlich gar nicht so unsympathisch. Wenn man eh gern ueber Variablengrenzen hinweg frickelt, hilft das uU. sogar Fehler zu vermeiden.
camper schrieb:
Und nein, ich will damit keine Diskussion starten - letztlich sind beide Assembler mehr oder minder unbrauchbar.
Gut, aber dann einfach so eine nackte Behauptung in den Raum zu schmeissen ist auch unschoen (auch wenn ich dir zustimme, dass beide noch durchaus verbesserungswuerdig sind).