2011-11-30 7 views
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 메서드를 호출하면 조건문이 제대로 작동하지 않는지 알 수 없습니다. 아래의 예 예, JBE :조건부 점프를 위해 x86 어셈블리 플래그를 수정하려면 어떻게합니까?

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 

답변

1

(다른 많은 산술/논리 명령 등)을 ADD 명령은 EFLAFS에 영향을 미치는 이유 JBE 행위를하지 무엇 _Str_compare 반환하지만에 ADD ESP, 16 결과에 뭔가 다른,에. 나는 같은 문제가 ADD EBP, 4XOR EAX, EAX에 존재한다고 생각한다.

영향을받은 깃발의 측면에서 지침을 다시 확인하십시오. AMD의 CPU 매뉴얼에는 3 권 말미에 모든 플래그 수정 지침이 나열된 좋은 요약 정보가 있습니다.