2013-10-19 86 views
0

如何实现这样的事情:.IF比较字符串MASM

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 

我需要MOV ABC &高清弄成第一或者是这通常是不可能的?

+0

'abc'和'def'是指向字符串的指针,而不是字符串本身。通过比较它们,你可以比较不同的内存地址,除非它们指向的地方不同,即使它们指向的字符串是相同的。为了比较字符串,您必须访问这些地址,并在每个字节之间逐字节地进行更深的比较,以了解字符串是否相等。你可能需要为此写一个函数。 – Havenard

+0

的确,我在下面使用简单的repempmpb行来编写了一个这样的函数的例子来进行更深入的比较。 –

回答

0

您可以在汇编中编写cmpstr函数的版本。例如:

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: 
+0

最终使用'lstrcmpi'和'.if eax == FALSE',但是这绝对让我朝着正确的方向前进,谢谢。 :) –