Archiv verlassen und diese Seite im Standarddesign anzeigen : Was mache ich falsch?
DeinGott
07.02.2005, 20:03
Hi@all
Ich hab vor kurzem mit ASM angefangen, und spiel derzeit ein bisschen damit rum. Vorallem probiere ich mit ein paar Tutorial-Codes, habe aber bei einem ein kleines Problem[NASM]:
ORG 100h ;Startadresse COM
start: ;Startlabel
JMP begin ;Sprung zu Label begin
wert1 DB 10 ;Variable wert1
wert2 DB 0 ;Variable wert2
text1 DB "Werte gleich$";Meldung 1
text2 DB "Wert1 größer$";Meldung 2
text3 DB "Wert2 größer$";Meldung 3
begin: ;Beginn des Proggys
MOV BH,BYTE PTR wert2 ; Wert 2 auf BH
CMP wert1,bh ;Werte vergleichen
JNE ungleich ;Wenn ungleich -> Label ungleich
MOV DX,text1 ;Ansonsten Meldung 1
JMP ausgabe ;Sprung zu Label ausgabe
ungleich: ;Wenn ungleich...
JB w2groesser ;Wenn W2 größer -> Label w2groesser
MOV DX, text2 ;Ansonsten Meldung 2
JMP ausgabe ;Sprung zu Label ausgabe
w2groesser: ;Wenn Wert 2 größer...
MOV DX,text3 ;Meldung 3
ausgabe: ;Meldung ausgeben
MOV AX,0900h ;Funkt. 9
INT 21h ;String ausgeben
MOV AX,4C00h ;Funkt. 4Ch
INT 21h ;Programm beenden
Der Compiler meint "ua.asm:10: error: comma or end of line expected"
Das müsste diese Zeile sein:
MOV BH,BYTE PTR wert2
Aber was ist da falsch?
Hi,
Ich weiß zwar nicht, wie das bei NASM ist aber normalerweise sieht eine Adressierung so aus:
[adresse]
Bei dir also:
mov bh,byte ptr [wert2]
cmp bh,byte ptr [wert1]
Cya Argone
butterkeks
07.02.2005, 23:46
"byte ptr" sollte zudem überflüssig sein, oder?
"byte ptr" sollte zudem überflüssig sein, oder?
Mag schon sein aber es ist auch nicht falsch!
DeinGott
08.02.2005, 19:38
also bei mir funktioniert keine der Varianten
Jan Krüger
08.02.2005, 20:31
Wenn du die beiden Vorschläge von Argone und butterkeks kombinierst, funktioniert's.
Hmmm dann ist es wohl doch falsch....
Sry!
coder_freddy
09.02.2005, 10:28
was hältst du davon?
myseg segment
assume cs:myseg
org 100h
start:
haupt proc
MOV BH,BYTE PTR [wert2] ; Wert 2 auf BH
CMP BYTE PTR [wert1],bh ;Werte vergleichen
JNE ungleich ;Wenn ungleich -> Label ungleich
MOV DX,OFFSET text1 ;Ansonsten Meldung 1
JMP ausgabe ;Sprung zu Label ausgabe
ungleich: ;Wenn ungleich...
JB w2groesser ;Wenn W2 größer -> Label w2groesser
MOV DX, OFFSET text2 ;Ansonsten Meldung 2
JMP ausgabe ;Sprung zu Label ausgabe
w2groesser: ;Wenn Wert 2 größer...
MOV DX,OFFSET text3 ;Meldung 3
ausgabe: ;Meldung ausgeben
MOV AX,0900h ;Funkt. 9
INT 21h ;String ausgeben
MOV AX,4C00h ;Funkt. 4Ch
INT 21h ;Programm beenden
wert1 DB 10 ;Variable wert1
wert2 DB 0 ;Variable wert2
text1 DB "Werte gleich$";Meldung 1
text2 DB "Wert1 größer$";Meldung 2
text3 DB "Wert2 größer$";Meldung 3
haupt endp
myseg ends
end start
hab das jetzt nicht kompeliert, sollte aber funktionieren...
Gruß Freddy
Jan Krüger
09.02.2005, 14:10
Tut's aber nicht. Zumindest nicht mit NASM.
test.asm:1: error: parser: instruction expected
test.asm:2: error: parser: instruction expected
test.asm:5: error: parser: instruction expected
test.asm:6: error: comma or end of line expected
test.asm:7: error: comma or end of line expected
test.asm:9: error: comma or end of line expected
test.asm:13: error: comma or end of line expected
test.asm:16: error: comma or end of line expected
test.asm:28: error: symbol `haupt' redefined
test.asm:28: error: parser: instruction expected
test.asm:30: error: symbol `myseg' redefined
test.asm:30: error: parser: instruction expected
test.asm:31: error: parser: instruction expected
coder_freddy
09.02.2005, 19:01
mit dem masm funzt so (vielleicht hilft das ja für den NASM):
myseg segment
assume cs:myseg,DS:dseg
org 100h
start:
haupt proc
MOV AX,dseg
MOV DS,AX
MOV BH,BYTE PTR wert2 ; Wert 2 auf BH
CMP BYTE PTR wert1,bh ;Werte vergleichen
JNE ungleich ;Wenn ungleich -> Label ungleich
MOV DX,OFFSET text1 ;Ansonsten Meldung 1
JMP ausgabe ;Sprung zu Label ausgabe
ungleich: ;Wenn ungleich...
JB w2groesser ;Wenn W2 größer -> Label w2groesser
MOV DX, OFFSET text2 ;Ansonsten Meldung 2
JMP ausgabe ;Sprung zu Label ausgabe
w2groesser: ;Wenn Wert 2 größer...
MOV DX,OFFSET text3 ;Meldung 3
ausgabe: ;Meldung ausgeben
MOV AH,9 ;Funkt. 9
INT 21h ;String ausgeben
MOV AX,4C00h ;Funkt. 4Ch
INT 21h ;Programm beenden
haupt endp
myseg ends
DSEG SEGMENT 'DATA'
wert1 DB 10 ;Variable wert1
wert2 DB 20 ;Variable wert2
text1 DB "Werte gleich$";Meldung 1
text2 DB "Wert1 größer$";Meldung 2
text3 DB "Wert2 größer$";Meldung 3
DSEG ENDS
SSEG SEGMENT STACK
DW 128 DUP (?)
SSEG ends
end start
diesmal auch getestet :)
Hatte wohl irgendwie MASM gelesen *sorry*
DeinGott
10.02.2005, 16:25
also bei mir hat hier noch nix functioniert.
@coder-freddy: ich will doch com datas
ORG 100h ;Startadresse COM
start: ;Startlabel
JMP begin ;Sprung zu Label begin
wert1 DB 10 ;Variable wert1
wert2 DB 0 ;Variable wert2
text1 DB "Werte gleich$";Meldung 1
text2 DB "Wert1 größer$";Meldung 2
text3 DB "Wert2 größer$";Meldung 3
begin: ;Beginn des Proggys
MOV BH, BYTE [wert2] ; Wert 2 auf BH
CMP [wert1],bh ;Werte vergleichen
JNE ungleich ;Wenn ungleich -> Label ungleich
MOV DX,text1 ;Ansonsten Meldung 1
JMP ausgabe ;Sprung zu Label ausgabe
ungleich: ;Wenn ungleich...
JB w2groesser ;Wenn W2 größer -> Label w2groesser
MOV DX, text2 ;Ansonsten Meldung 2
JMP ausgabe ;Sprung zu Label ausgabe
w2groesser: ;Wenn Wert 2 größer...
MOV DX,text3 ;Meldung 3
ausgabe: ;Meldung ausgeben
MOV AX,0900h ;Funkt. 9
INT 21h ;String ausgeben
MOV AX,4C00h ;Funkt. 4Ch
INT 21h ;Programm beenden
so sachen wie myseg, assume und proc gibt es bei nasm so nicht. auch die schlüsselwörter OFFSET und PTR sind überflüssig. nasm regelt das alles darüber ob da nun eckige klammern (PTR) oder nicht (OFFSET) sind.
DeinGott
11.02.2005, 13:53
Thx jetzt funtzt alles so wie es sein sollte
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.