Search code examples
assemblymasmmasm32

.IF comparing strings MASM


How do I achieve something like this:

abc db "abc",0
def db "def",0
textnotequal db "strings are not equal",0
textequal db "strings are equal",0

 .if abc != def
    invoke MessageBox, NULL, addr textnotequal, addr textnotequal, MB_OK

 .elseif abc == def
     invoke MessageBox, NULL, addr textequal, addr textequal, MB_OK
 .endif

Do I need to mov abc & def into something first or is this generally not possible ?


Solution

  • You can write your version of cmpstr function in assembly. For example:

    abc db "abc",0
    def db "def",0
    ...
    mov ecx,3     #the length of the abc and def strings
    cld           #set the direction flag so that EDI and ESI will increase using repe
    mov esi, offset [abc]  #moves address of abc string into esi
    mov edi, offset [def]  #exact syntax may differ depending on assembler you use
                           #I am not exactly sure what MASM accepts but certainly something similar to this
    repe cmpsb     #repeat compare [esi] with [edi] until ecx!=0 and current chars in strings match
                   #edi and esi increase for each repetition, so pointing to the next char
    cmp ecx,0      #test if the above command passed until the end of strings
    je strings_are_equal  #if yes then strings are equal
    # here print the message that strings are not equal (i.e. invoke MessageBox)
    jmp end
    strings_not_equal:
    # here print the message that strings are equal (i.e. invoke MessageBox)
    end: