PDA

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?


Argone
07.02.2005, 23:11
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?

Argone
08.02.2005, 17:01
"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.

Argone
08.02.2005, 21:53
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

Jidder
10.02.2005, 17:09
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