masm eingabe vergleichen
-
Hallo wie kann ich meine Text Eingabe vergleichen ?
Weil so funktioniert es nicht.
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.Assembling: console.asm
console.asm(58) : fatal error A1010: unmatched block nesting : .if-.repeat-.whil
e
_
Assembly Error
Drücken Sie eine beliebige Taste . . ..486 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\macros\macros.asm include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .code start: call main exit ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« main proc LOCAL str1:DWORD mov str1, input("Text 1: ") .if str1 == "2" print "ok" .else print "error" ret main endp end start
-
.endif fehlt
"wenn" dann müsste so aussehen:
main proc LOCAL str1:DWORD _loop: mov str1, input("Text 1: ") .if str1 == "2" print "ok", 13, 10 .elseif str1 == "0" jmp _end .else print "error", 13, 10 print str1 .endif jmp _loop _end: ret main endp
Das scheitert so aber immer noch, weil str1 ein Pointer ist, den du mit
.if str1 == "2"
fragst ob der Pointer(!) den Wert "2" hat.
-
hier der korrigierte Code mit Vorschlägen zum String vergleich. Zur Funktion szCmp, welche durch die masmlib bereitgestellt wird, bitte einen Blick in \masm32\help\masmlib.chm werfen. Hilfe zu den macros und Hochsprachen ähnlichen Ausdrücken (.if/.while/…) findest du in \masm32\help\hlhelp.chm.
include masm32rt.inc .code start: call main inkey exit main proc LOCAL psz:DWORD mov psz,input("Text 1: ") ;invoke szCmp,psz,"1" ;.if eax ;.else ;.endif .if rv(szCmp,psz,"2") print "ok",10,13 .else print "error",10,13 .endif ; wenn mit mehr als einem string abgeglichen werden soll: ; switch$ psz ; case$ "2" ; print "ok",10,13 ; case$ "3" ; ; ... ; else$ ; print "error",10,13 ; endsw$ ret main endp end start
-
masm schrieb:
;invoke szCmp,psz,"1"
ups ... invoke muss durch fn ersetz werden, da invoke den string literal in den entsprechenden ASCI-code umwandelt und nicht in einen Zeiger auf einen solchen string
-
Ich weiß nicht so recht.
Wenn ich mir den Code so ansehe, dann scheint mir am problematischsten der
Befehlmov str1,input("text1") zu sein
(vielleicht fehlt hier nur ein semikolon?spaß beiseite,
wenn mit str1 und input() speicherstellen gemeint sind, dann geht der move-befehl nicht.
Ein Textstellenvergleich geht, solange man keine Multimediabefehle benutzt nur über vergleichbare Größen und Schrittweise.
Die Hochsprachenelemente verschleiern das mögliche bzw. machbare.
Verwandelt Masm eine DWORD Größe automatisch an die Größe des Vergleichselements (hier = 2 = 32h = Byte oder die 32h nach 00000032h)?Man braucht hier auch nicht wirklich Hochsprachenelemente. Der übliche Weg ist
cmp Register,Wert jump equal/jump not equal
D.h. man sollte zuerstmal wissen, WOHIN die Systemfunktion beim Einlesen die Tastatureingabe setzt. Auf der Biosebene ist das meistens Teilregister AL
Also:
cmp al,32h
jump equal +2
jmp Fehler-PrintRoutine
Call OK-Printroutine
-
nachtfeuer schrieb:
wenn mit str1 und input() speicherstellen gemeint sind, dann geht der move-befehl nicht.
input() is ein macro der ein offset zurückgibt.
nachtfeuer schrieb:
Ein Textstellenvergleich geht, solange man keine Multimediabefehle benutzt nur über vergleichbare Größen und Schrittweise.
so so ...
nachtfeuer schrieb:
Die Hochsprachenelemente verschleiern das mögliche bzw. machbare.
Wirklich?
nachtfeuer schrieb:
Verwandelt Masm eine DWORD Größe automatisch an die Größe des Vergleichselements (hier = 2 = 32h = Byte oder die 32h nach 00000032h)?
ja: "abcd" wird z.B. zu 0x61626364
nachtfeuer schrieb:
D.h. man sollte zuerstmal wissen, WOHIN die Systemfunktion beim Einlesen die Tastatureingabe setzt. Auf der Biosebene ist das meistens Teilregister AL
-
@ Nachfeuer
Du scherzt nur oder?