[英]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.