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) 程序集

x86汇编学习历程6----负数在计算机中的表示和应用方法(附FLAGS拓展和cmp及条件转移指令)

带括号和地址的 x86 中的 CMP

x86 cmp 寄存器和内存 - 中间数据保存在哪里?

X86汇编层面的方法调用。