簡體   English   中英

在cmp之后組裝x86調用

[英]Assembly x86 call after cmp

我有以下代碼比較數字並在true或false時增加變量

failcheck1:
            mov eax, val1
            add ebx, 4
            cmp eax, 40
            jl failinc1

            mov eax, passes
            inc eax
            mov passes, eax
            jmp failcheck2

failinc1:
            mov eax, fails
            inc eax
            mov fails, eax


failcheck2 :
            mov eax, val2
            add ebx, 4
            cmp eax, 40
            jl failinc2

            mov eax, passes
            inc eax
            mov passes, eax
            jmp failcheck3

failinc2:
            mov eax, fails
            inc eax
            mov fails, eax

我有8張這樣的支票。 我想知道是否創建帶有ret的單個failinc和passinc子例程,如何在cmp之后調用它?

因為EBX獨立地遞增,所以您可以將8 add ebx, 4替換為單個add ebx, 4*8

您可以通過使用條件設置指令setl (Set On Less)來避免所有這些丑陋且耗時的條件跳轉。

因為失敗通過是互斥的,所以您可以推遲計算通過到最后。 例如,如果處理8個值給出3個失敗,那么不可避免地必須經過5 (8減3)。

 xor  ecx, ecx    ;Clear because SETL only operates on a byte
 xor  edx, edx    ;Clear temporary counter of fails

 cmp  val1, 40
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter
 cmp  val2, 40
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter
 cmp  val3, 40
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter
 cmp  val4, 40
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter
 cmp  val5, 40
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter
 cmp  val6, 40
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter
 cmp  val7, 40
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter
 cmp  val8, 40
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter

 add  fails, edx  ;Add temporary counter to actual variable
 sub  edx, 8
 sub  passes, edx ;Add complementary count to other variable (*)

 add  ebx, 4*8

我想知道是否創建帶有ret的單個failinc和passinc子例程,如何在cmp之后調用它?

現在子程序

AddTempCount:     ;On input EFLAGS is set from CMP instruction
 setl cl
 add  edx, ecx    ;Conditionally increment temporary counter
 ret

可以稍微提高可讀性。

 xor  ecx, ecx    ;Clear because SETL only operates on a byte
 xor  edx, edx    ;Clear temporary counter of fails

 cmp  val1, 40
 call AddTempCount
 cmp  val2, 40
 call AddTempCount
 cmp  val3, 40
 call AddTempCount
 cmp  val4, 40
 call AddTempCount
 cmp  val5, 40
 call AddTempCount
 cmp  val6, 40
 call AddTempCount
 cmp  val7, 40
 call AddTempCount
 cmp  val8, 40
 call AddTempCount

 add  fails, edx  ;Add temporary counter to actual variable
 sub  edx, 8
 sub  passes, edx ;Add complementary count to other variable (*)

 add  ebx, 4*8

(*)減去負數與增加正數相同。

failcheck:
    mov eax, [eax]
    add ebx, 4
    cmp eax, ecx
    jl .L1
    incl passes
    ret
.L1:
    incl fails
    ret

failcheck1:
    lea eax, val1
    mov ecx, 40
    call failcheck

    lea eax, val2
    mov ecx, 40
    call failcheck

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM