Syntax Fehler
-
Hallo ich hab endlich nach langem suchen ein Tutorial gefunden nur dummerweise muss man manche Source Codes verändern -.-
Hier ist der Source Code:
Er lässt sich Compilieren und Linken und alles nur wenn ich das Programm starte dann kommt die Meldung: Syntax Fehler
.MODEL SMALL ;Standart Speichermodell fuer EXE .STACK 100h ;100h Stack sind mehr als genug .DATA ;Beginn des Datensegements Frage DB "Geht es Ihnen gut (j/n)?$" ;Die Frage und die Antworten enden Antwort1 DB 13,10,"Toll !$" ;mit einem $ um DOS zu zeigen, dass Antwort2 DB 13,10,"Schade !$" ;es keine Zeichen mehr ausgeben soll ;13=Carriage Return ;10=Zeilenvorschub, d.h. zur naechsten ;Zeile an den Anfang gehen. .CODE ;Beginn des Codesegmentes Entrypoint: mov ax,@data ;@data ist eine Vordefinierte Konstante, ;sie enthaelt die Adresse des ;Datensegments mov ds,ax ;ds = ax = @data => Datensegment bereit mov dx,OFFSET Frage ;Die Offsetadresse der Frage nach dx mov ah,09h ;DOS Funktion 9: Stringausgabe. ;Ausgegeben wir der String an DS:DX ;bis $ int 21h ;DOS Funktion 9 ausfuehren! mov ah,07h ;DOS Funktion 7: Zeichen von Tastatur int 21h ;lesen. Das Zeichen wird in al ;ausgegeben. cmp al,"j" ;Vergleiche al mit j ACHTUNG SIEHE UNTEN je Toll ;Wenn gleich Springe zum Label Toll cmp al,"J" ;Vergleiche al mit J ACHTUNG SIEHE UNTEN je Toll ;Wenn gleich springe zum Label Toll NichtToll: ;Dieses Label dient nur der Uebersicht. mov ah,09h ;DOS Funktion 9: Stringausgabe lea dx,Antwort2 ;Anstatt mov dx,OFFSET Antwort2 int 21h ;DOS Funktion ausfuehren. jmp Ende ;Zum Label Ende springen. Toll: mov ah,09h ;Ausgabe der Antwort 1 lea dx,Antwort1 int 21h Ende: mov ah,4Ch ;DOS Funktion Programm beenden. int 21h ;Programm beenden, Kontrolle ans ;Betriebssystem geben. END Entrypoint END ;Assembleranweisung: Ende des ProgrammesHier ist der Original Source Code aus dem Tutorial:
.MODEL SMALL ;Standart Speichermodell fuer EXE .STACK 100h ;100h Stack sind mehr als genug .DATA ;Beginn des Datensegements Frage DB "Geht es Ihnen gut (j/n)?$" ;Die Frage und die Antworten enden Antwort1 DB 13,10,"Toll !$" ;mit einem $ um DOS zu zeigen, dass Antwort2 DB 13,10,"Schade !$" ;es keine Zeichen mehr ausgeben soll ;13=Carriage Return ;10=Zeilenvorschub, d.h. zur naechsten ;Zeile an den Anfang gehen. .CODE ;Beginn des Codesegmentes mov ax,@data ;@data ist eine Vordefinierte Konstante, ;sie enthaelt die Adresse des ;Datensegments mov ds,ax ;ds = ax = @data => Datensegment bereit mov dx,OFFSET Frage ;Die Offsetadresse der Frage nach dx mov ah,09h ;DOS Funktion 9: Stringausgabe. ;Ausgegeben wir der String an DS:DX ;bis $ int 21h ;DOS Funktion 9 ausfuehren! mov ah,07h ;DOS Funktion 7: Zeichen von Tastatur int 21h ;lesen. Das Zeichen wird in al ;ausgegeben. cmp al,"j" ;Vergleiche al mit j ACHTUNG SIEHE UNTEN je Toll ;Wenn gleich Springe zum Label Toll cmp al,"J" ;Vergleiche al mit J ACHTUNG SIEHE UNTEN je Toll ;Wenn gleich springe zum Label Toll NichtToll: ;Dieses Label dient nur der Uebersicht. mov ah,09h ;DOS Funktion 9: Stringausgabe lea dx,Antwort2 ;Anstatt mov dx,OFFSET Antwort2 int 21h ;DOS Funktion ausfuehren. jmp Ende ;Zum Label Ende springen. Toll: mov ah,09h ;Ausgabe der Antwort 1 lea dx,Antwort1 int 21h Ende: mov ah,4Ch ;DOS Funktion Programm beenden. int 21h ;Programm beenden, Kontrolle ans ;Betriebssystem geben. END ;Assembleranweisung: Ende des ProgrammesWas ich hab da jetzt falsch gemacht ?
Hier ist das Tutorial:
Der Source Code ist auf Seite 23-24
-
Oh hab noch was vergessen sry
Diese zwei Zeilen sehen im Original Source Code so aus:
cmp al,´j´ ;Vergleiche al mit j ACHTUNG SIEHE UNTEN
cmp al,´J´ ;Vergleiche al mit J ACHTUNG SIEHE UNTENIch hatte die aber so geändert:
cmp al,"j" ;Vergleiche al mit j ACHTUNG SIEHE UNTEN
je Toll ;Wenn gleich Springe zum Label Toll
cmp al,"J" ;Vergleiche al mit J ACHTUNG SIEHE UNTENAber dann hab ich diese Fehlermeldung bekommen:
Assembling file: if.asm
**Error** if.asm(14) Undefined symbol: J┤
**Error** if.asm(16) Undefined symbol: J┤
Error messages: 2
Warning messages: None
Passes: 1
Remaining memory: 412k
-
Also ich sags ja nur ungern, aber wenn du eine Binärdatei direkt ausführst (nicht in einem Emulator), dann bekommst du im Fehlerfall höchstens ein "Segmentation fault (core dumped)" bzw. das Windowsäquivalent dazu und keine "Syntax Fehler"-Meldung.
Warum du bei den Accents einen Fehler bekommst kann ich mir nur dadurch erklären, dass du per Copy 'n Paste aus der PDF kopiert hast.
-
Mhhm jetzt funktioniert es irgendwie war der Assembler am spinnen O_o
-
Hallo ich hab nochmal eine Frage
Frage DB "Geht es Ihnen gut (j/n)?$" ;Die Frage und die Antworten enden Antwort1 DB 13,10,"Toll !$" ;mit einem $ um DOS zu zeigen, dass Antwort2 DB 13,10,"Schade !$" ;es keine Zeichen mehr ausgeben soll ;13=Carriage Return ;10=Zeilenvorschub, d.h. zur naechsten ;Zeile an den Anfang gehen.Was bringt dieser Teil hier:
Antwort1 DB 13,10,"Toll !"
Durch die 10 z.b. soll ja ein Zeilenvorschub erfolgen und durch die 13 ein Return.
Nur seh ich da nix von das Programm sieht ohne diese Zahlen genau so aus wie mit.
Mit Zahlen:
Antwort1 DB 13,10,"Toll !"
Ohne Zahlen:
Antwort1 DB "Toll !"
-
Ach ja noch was das Tutorial wäre vielleicht was für das FAQ
-
Hallo ich hab nochmal eine Frage
Frage DB "Geht es Ihnen gut (j/n)?$" ;Die Frage und die Antworten enden Antwort1 DB 13,10,"Toll !$" ;mit einem $ um DOS zu zeigen, dass Antwort2 DB 13,10,"Schade !$" ;es keine Zeichen mehr ausgeben soll ;13=Carriage Return ;10=Zeilenvorschub, d.h. zur naechsten ;Zeile an den Anfang gehen. Frage DB "Geht es Ihnen gut (j/n)?$" ;Die Frage und die Antworten enden Antwort1 DB 13,10,"Toll !$" ;mit einem $ um DOS zu zeigen, dass Antwort2 DB 13,10,"Schade !$" ;es keine Zeichen mehr ausgeben soll ;13=Carriage Return ;10=Zeilenvorschub, d.h. zur naechsten ;Zeile an den Anfang gehen.Was bringt dieser Teil hier:
Antwort1 DB 13,10,"Toll !$" Antwort2 DB 13,10,"Schade !$"Durch die 10 z.b. soll ja ein Zeilenvorschub erfolgen und durch die 13 ein Return.
Nur seh ich da nix von das Programm sieht ohne diese Zahlen genau so aus wie mit.
Und hier hätte ich noch nochmal eine Frage.
mov ah,07h kann ich mir das so vorstellen das dass einfach eine eingabe ist
sowie z.b.cin>>bei c++ ?
Wenn ja kann man die eingabe auch noch in einer anderen Variable speichern als in al
cmp al,"j"wobei al ist ja eigentlich auch keine Variable oder ?
Weil man deklariert ja al nicht.
mov ah,07h ;tastaur eingabe int 21h cmp al,"j"´Edit und Anmerkungen dazu:
1. Wenn du deinen kompletten Post wiederholst, wird er auch nicht schneller beantwortet.
2. Wir haben auch fuer asm eigene Tags - und eine Vorschau-Funktion. So kannst du pruefen, ob alle Tags richtig gesetzt sind.
3. Ich habe das Tut bereits in die FAQ aufgenommen und jeder duerfte inzwischen geschnallt haben, dass du es toll findest, brauchst es also nicht an jeden deiner Posts an zu haengen.
-
Sry für die flasche Code Tags und so.
Ich wollte noch sagen das ich dass mit den Zeilenumbrüchen jetzt selber hinbekommen habe ....
-
Syntax Fehler schrieb:
Und hier hätte ich noch nochmal eine Frage.
mov ah,07h kann ich mir das so vorstellen das dass einfach eine eingabe ist
sowie z.b.cin>>bei c++ ?
Das mov ah, 07h macht allein nicht viel. int 21h, Funktion 7 (Funktionsnummer steht in ah) ist IMHO vielleicht eher mit getch, denn mit cin zu vergleichen...
Syntax Fehler schrieb:
Wenn ja kann man die eingabe auch noch in einer anderen Variable speichern als in al
Naajaaa, im Grunde kann das Variablen-Konzept in Hochsprachen in Assembler vieles sein. idR. meint man mit "Variable" aber einen kleinen Speicherbereich. al ist aber ein Register der CPU und liegt nicht im Speicher. Register bezeichnet man ueblicherweise nicht als Variablen.
int 21h, Funktion 7 Speichert seinen Rueckgabewert immer per Definition in al. Eben weil diese System-Funktion so geschrieben wurde. Du kannst al hinterher natuerlich hinschieben, wo du willst. Ist in diesem einfachen Beispiel aber wenig zweckmaessig.Syntax Fehler schrieb:
Ich wollte noch sagen das ich dass mit den Zeilenumbrüchen jetzt selber hinbekommen habe ....
Und was war des Raetsels Loesung?
-
Ty für die Antwort.
Das Rätsels Lösung war:
Da ich nur 1 Ausgabe hatte konnte ich natürlich keinen Zeilenumbruch sehen

Als ich das Programm dann mal umgeschrieben habe das es 2 Ausgaben macht da konnte ich auch meinen Zeilenumbruch bewundern.

-
Ah noch eine Frage was bedeutet das mit Dos Funktion 7 und so ?
Sind das irgendwelche Funktionen die Nummern haben, wenn ja kann man die irgendwo nachschauen ?
-
Ein Interrupt, aufgerufen durch das Mnemonic "int" kannst du dir wie einen Funktionsaufruf vorstellen. 256 verschiedene Interrupts gibt es, damit also 256 verschiedene Funktionen, die verschiedensten Krimskrams erledigen.
Aus Gruenden der Einfachheit und Kompatibilitaet teilt man eine Interruptfunktion wiederum in verschiedene Unterfunktionen auf, indiziert ueber Funktionsnummern, die idR. in Registern uebergeben werden. Im Fall von DOS int 21h zB. in ah.Nachschlagen kann man die verschiedenen Interrupt-Funktionen zB. in http://www.ctyme.com/rbrown.htm
-
k danke.