2017-03-13 7 views
0

J'essaie de trouver un maximum entre deux valeurstrouver Assemblée maximum de deux valeurs

_FindMax: 
    push ebp 
    mov ebp, esp 

    mov eax, dword [ebp+12] ; get fist argument 
    mov ebx, dword [ebp+8] ; get second argument 


    cmp eax, ebx 
    jl LESS  ; if eax less to LESS 

    LESS: 
    mov eax, ebx ; ebx is greate and return it 

    mov esp, ebp 
    pop ebp 

    ret 

mais problème est que moins: l'étiquette est toujours en cours d'exécution. par exemple si les paramètres sont égaux, alors LESS: label est en cours d'exécution. Pourquoi??

+1

Si la branche n'est pas prise, le code est automatiquement exécuté dans LESS. vous devez sauter par-dessus le code que vous voulez sauter – Tommylee2k

+1

Qu'attendiez-vous qu'il s'exécute, quand "pas moins" est vrai (je veux dire quand 'jl' ne saute pas)? BTW, vous pouvez également utiliser conditionnelle 'cmovCC', dans ce cas' cmovl eax, ebx' le résoudrait sans branchement. – Ped7g

+0

Merci à vous tous. Problème résolu. – Alatriste

Répondre

2

Une façon très efficace pour y parvenir serait (en supposant que vous avez au moins un processeur de la famille P6):

_FindMax: 
    mov eax, dword [esp+8]  /* get first argument */ 
    mov ebx, dword [esp+4]  /* get second argument */ 
    cmp eax, ebx     /* compare EAX to EBX */ 
    cmovl eax, ebx    /* MOV EBX to EAX if EBX > EAX */ 
    ret 

Ce code omet le cadre de pile (EBP) et utilise une opération en ligne MOV pour faire la comparaison. Néanmoins, la valeur de retour est toujours EAX.

2

Le code dans LESS est toujours exécuté, que la branche soit prise ou non. Vous devez ignorer le code que vous ne voulez pas exécuter:

_FindMax: 
    push ebp 
    mov ebp, esp 

    mov eax, dword [ebp+12] ; get fist argument 
    mov ebx, dword [ebp+8] ; get second argument 


    ; invert the condition, and jump over the code to skip 
    cmp eax, ebx 
    jge SKIP  ; jmp and return, if aex is the larger one 

    mov eax, ebx ; ax is NOT larger, so return ebx 

    SKIP: 
    mov esp, ebp 
    pop ebp 

    ret 
+0

Merci. résolu. – Alatriste