cmp后汇编x86调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cmp后汇编x86调用相关的知识,希望对你有一定的参考价值。
我有以下代码来比较数字并增加一个变量,如果是真或假
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个这样的支票。我想知道我是否创建了一个单一的failinc和passinc子程序,并且在cmp之后如何调用它?
答案
因为qazxsw poi是独立递增的,所以你可以用一个额外的EBX
替换8个qazxsw poi。
通过使用条件集指令add ebx, 4
(Set On Less),可以避免所有那些丑陋且耗时的条件跳转。
因为失败和传递是互斥的,所以你可以推迟计算传球到最后。例如如果处理8个值给出3个失败则那么不可避免地必须有5个传递(8减3)。
add ebx, 4*8
我想知道我是否创建了一个单一的failinc和passinc子程序,并且在cmp之后如何调用它?
现在的子程序
setl
可以提高一点可读性。
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
(*)减去负数与添加正数相同。
另一答案
AddTempCount: ;On input EFLAGS is set from CMP instruction
setl cl
add edx, ecx ;Conditionally increment temporary counter
ret
以上是关于cmp后汇编x86调用的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向x86 汇编 ( cmp 比较指令 | test 比较指令 )
cmp 不工作 - Intel x86 (IA32) 程序集