1

2 つの文字列を比較して、アセンブリが等しいかどうかを確認しようとしています。大文字と小文字を区別。それらは cpp ラッパーから渡されます。これが私がこれまでに持っているものです:

1 つの文字列を esi に保存し、もう 1 つを edi に保存しました。

LOOP:
    mov al, [esi + edx*4]
    mov bl, [edi + edx*4]
    sub al, bl
    INC edx
    je LOOP
    jmp END_LOOP  ; if it's not equal, do some stuff at the end

END_LOOP:

私は何を間違っていますか?char配列の最後にいることをどのように知るのですか?

4

2 に答える 2

4

これらの文字列はC++文字列であり、charワイド文字ではなくsで構成されていると推測されるため、各文字のサイズは1バイトであるため、インデックスレジスタに4を掛けないでください。また、直前インクリメントするedxことはできません。ジャンプだけがedxがゼロにバンプされているので、あなたの指示。edxje

最後に、文字列は0バイトで終わります。したがって、ループを停止するタイミングを知るために、alまたはゼロになることを探しています。bl

次の行に沿ってコードを変更できます。

    xor edx, edx         ; make sure edx is 0 to start with
LOOP:
    mov al, [esi + edx]
    mov bl, [edi + edx]
    inc edx              ; prepare for next char
    cmp al, bl           ; compare two current characters
    jne DIFFERENT        ; not equal, get out, you are DONE!
    cmp al, 0            ; equal so far, are you at the end?
    je SAME              ; got to end of both strings, you're good, get out
    jmp LOOP             ; okay well they agree so far, go to next char
DIFFERENT:
    ; Do what you need to do for the strings being different
    ;
    ;
    jmp DONE
SAME:
    ; Do what you need to do for the strings being the same
    ;
    ;
DONE:

ただし、x86で文字列比較を検索することをお勧めします。指示がありcmpsます。strncmp必要に応じて、関数を呼び出すように手配することもできます。これを行うにはいくつかの方法があります。

于 2012-07-26T06:44:51.173 に答える
2

さて...なぜ「edx*4」なのか?4文字ごとに比較するだけのようです。「sub」はフラグを「cmp」と同じように設定します。違いは、「sub」がalを上書きし、「cmp」がフラグを設定するだけで、両方のレジスタをそのままにしておくことです。どちらもあなたのために働くはずです。

次に、「incedx」を実行します。これによりフラグが再度設定され、フラグを使用して文字列が等しいかどうかを確認する必要があります。「inc」は、ほとんどのフラグを設定しますが、キャリーフラグはそのままにしておくという点で、一種の「面白い」命令です。これはあなたを助けるつもりはありません。「inc」を実行する必要がありますが、cmp/subと条件付きジャンプの間では実行できません。

私が間違っていない限り、Cは「文字列」を文字のゼロで終了する配列として定義しているので、文字列がゼロで終了していると仮定するのはおそらく安全です。別の方法は、別のパラメーターとして長さを渡すことです。

レイはあなたの問題を解決するはずのいくつかの素晴らしいコードを投稿したので、やめます...

最高、フランク

于 2012-07-26T07:18:40.740 に答える