2017-03-13 16 views
0

の最大を見つける私は、2つの値議会は2つの値

_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 

間の最大値を見つけようとしているが、問題はLESSことです:ラベルは常に実行されています。たとえば、パラメータがLESSと等しければ、ラベルが実行されています。なぜ??

+1

ブランチが作成されていない場合、コードは自動的にLESSに実行されます。 – Tommylee2k

+1

"less"が真でないとき( 'jl'がジャンプしていないとき)、何を実行すると思いますか? BTWでは、条件付き 'cmovCC'を使うこともできます。この場合、' cmovl eax、ebx'は分岐せずに解決します。 – Ped7g

+0

ありがとうございます。問題が解決しました。 – Alatriste

答えて

2

これを達成するために、本当に効率的な方法は、(あなたは、少なくとも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 

このコードは、スタックフレーム(EBP)を省略し、インラインMOV操作を使用して比較を行います。それにもかかわらず、戻り値はまだEAXです。

2

分岐が行われたかどうかにかかわらず、LESSのコードは常に実行されます。

_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

ありがとうございます。解決される。 – Alatriste

関連する問題