2014-01-05 73 views
-1

我有這樣的宏:字符串比較失敗的兩個字符

compare macro string1, string2 
    local equal, notequal 
    mov eax, 1 
    mov ecx, 4 
    lea esi, offset string1 
    lea edi, offset string2 
    cld 
    repz cmpsb 
    je equal 
    jmp notequal 
    equal: mov eax, 0 
    notequal: 
endm; 

如果string1爲「A + B」 1和字符串爲「A + B」所有的偉大工程和EAX是0 也工作了「 AB「或」AxB「..

爲什麼這不適用於比較」AB「和」AB「?

PS。我使用MASM,我寧願不使用C/C++函數

以後編輯:

string1 db "AB" 
operation db 6 dup(0) 

其中操作字符串2,我用這個宏從鍵盤 閱讀:

read macro var, typee 
    push offset var 
    push offset typee 
    call scanf 
    add esp, 8 
    mov esi, eax 
endm 

其中var實際上是操作,typee是=>字符串db「%s」,0

+1

我認爲你在比較四個字節。當你有三個字符加上終止''\ 0''時,所有四個字節都是相同的。當你有兩個字符加上''\ 0''時,你可能會發現自己的第四個字節沒有初始化,這通常會有所不同......你能確認「硬編碼」AB \ 0 \ 0工作嗎? – Floris

+0

兩個'\ 0'的硬編碼絕對可行。 – Devolus

+0

我剛剛添加了「稍後編輯」,如果string1將string1 db「AB \ 0 \ 0」和我a_file也將(從鍵盤)「AB \ 0 \ 0」它的工作..但我需要它使它只與AB – smotru

回答

1

需要查看您的精確定義和內容string1string2

如果你是空字符串(即最後一個值是0字節),那麼原因是在A?B的情況下,你要比較4個字符,包括最後一個(零)字節。如果你使用AB那麼第三個可能是零,但是第四個是什麼?它必須匹配。


編輯指定可能治癒

string1 db "AB" 
     db 2 dup(0) ;to fill out string1 to 4 bytes 
operation db 6 dup(0) 
+0

一起工作你能看到我的編輯嗎?謝謝 – smotru

+0

'string2' =='operation'的字節序列將是'A B \ 0 \ 0 .....',但'string1'將是'A B A B'。你需要填寫string1到你匹配的長度(4),字節爲0. – Magoo

+0

有沒有簡單的方法?即時新手.. – smotru

0

repz cmpsb指令會告訴你在字符串中的字符許多如何等於多達字節的ecx數量。

如果您比較的字符串與ecx中指出的大小相同,則代碼有效,但如果字符串較短(如第二個示例中所示),這意味着指令將循環到第三個字節(可能\0終止字符串),然後可能會擊中一個不再相等的字節,因此循環被更早地破壞,並且您的分支不被採用。

所以,如果你想比較任意大小的字符串,你可以把它放在ecx的長度,只有在比較後ecx == 0

如果你有不同長度的字符串,那麼你就知道它們不可能是平等的。

實際上,第四個字節發生不匹配對你來說是好事,因爲它是未定義的,並且你會認爲你的代碼工作正常,如果碰巧在最後有\0字節在正確的位置。

+0

但我其實不知道字符串的大小..它可能是A + B或AB也..我需要使它有點dinamiically。 PS。它也可以是「detA」 – smotru

+0

當然,所以你必須得到強度。要麼,要麼你必須手動循環。正如我所說,cmp指令只會告訴您有多少個字符能夠滿足您的比較。這還不足以說明兩個字符串是否匹配。 – Devolus