0
_Str_compare proc ; (byte * str1, byte * str2, DWORD str1_len, DWORD str2_len) :: Returns -1, 0, or 1 for str1 is lexiographically before, equivalent to, or after str2, respectively. Also modifies the carry and zero flags so that cmp can be used directly following invokation of this method.
; init
push ebp
mov ebp, esp
push edi
push esi
push ecx
push edx
xor esi, esi
xor edi, edi
xor ecx, ecx
xor edx, edx
add esi, DWORD PTR [ebp + 8] ; esi = str1
add edi, DWORD PTR [ebp + 12] ; edi = str2
mov edx, DWORD PTR [ebp + 16]
cmp edx, DWORD PTR [ebp + 20]
jae IFBLOCK1
    add ecx, DWORD PTR [ebp + 16]
IFBLOCK1:
    add ecx, DWORD PTR [ebp + 20]
add edx, ecx ; edx is a buffer for holding ecx's value after looping through the strings

; code
cld ; traverse strings from beginning to end
repe cmpsb
cmp esi, edx
jne IFBLOCK2
    mov edx, DWORD PTR [ebp + 16]
    cmp edx, DWORD PTR [ebp + 20]
    je op2
    jmp op1
IFBLOCK2:
mov edx, DWORD PTR [esi - 1]
cmp edx, DWORD PTR [edi - 1]
jb op1
je op2
ja op3
op1:
    lahf
    or ax, 01h ; set the carry flag
    and ax, 0FFBFh ; clear the zero flag
    sahf
    xor eax, eax
    dec eax
    jmp finish
op2:
    lahf
    and ax, 0FFFEh ; clear the carry flag
    or ax, 040h ; set the zero flag
    sahf
    xor eax, eax
    jmp finish
op3:
    lahf
    and ax, 0FFBEh ; clear both the carry and zero flags
    sahf
    xor eax, eax
    inc eax

finish: ; clean and exit method
    pop edx
    pop ecx
    pop esi
    pop edi
    add ebp, 4
    pop ebp
    ret
_Str_compare endp

私のプロシージャ_Str_compareでは、-1、0、または1が正しく返されますが、別のアセンブリプロシージャからこの_Str_compareメソッドを呼び出すと、条件ステートメントが正しく機能しない理由がわかりません。たとえば、以下の例:

sampleProc proc
    push 6
    push 3
    push sixLetteredStringAddress
    push threeLetteredStringAddress
    call _Str_compare
    add esp, 16
    jbe IF_STATEMENT_1
        inc eax ; dummy operation
    IF_STATEMENT_1:
    ret
sampleProc endp
4

1 に答える 1

1

ADD命令は (他の多くの算術/論理命令と同様に) に影響を与えます。これが、返されるものではなく、他の何か、つまり結果に作用するEFLAFS理由です。と にも同じ問題が存在すると思います。JBE_Str_compareADD ESP, 16ADD EBP, 4XOR EAX, EAX

影響を受けるフラグに関して、指示を再確認してください。AMD の CPU マニュアルでは、第 3 巻の最後に、すべてのフラグ変更命令がリストされているすばらしい要約があります。

于 2011-11-30T08:49:44.760 に答える