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
    Befehl

    mov 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?


Anmelden zum Antworten