Assembly cmp后的程序集x86调用

Assembly cmp后的程序集x86调用,assembly,x86,Assembly,X86,我有下面的代码来比较数字,并在真或假的情况下增加一个变量 failcheck1: mov eax, val1 add ebx, 4 cmp eax, 40 jl failinc1 mov eax, passes inc eax mov passes, eax jmp failcheck2 failinc

我有下面的代码来比较数字,并在真或假的情况下增加一个变量

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子例程,其中包含ret,那么在cmp之后如何调用它?

因为
EBX
是独立递增的,你可以用一个加法替换8
addebx,4

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
通过使用条件集指令
setl
(设置为Less),可以避免所有这些丑陋且耗时的条件跳转

因为失败和过程是互斥的,所以可以从计算过程推迟到最后。e、 g.如果处理给出3的8个值失败,则不可避免地必须通过5次(8减去3)


我想知道我是否创建了一个failinc和passinc子例程,其中包含ret,如何在cmp之后调用它

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
现在是子程序

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

(*)减去一个负数等于加上一个正数。

一如既往,函数本身在使用标记之前必须小心不要破坏它们,因为有一点:-使用
call
asm命令调用子例程:
call-ret
pair-googleit@KamilKiełczewski我知道我必须使用
call
,但我的问题是只有当
cmp-eax,40
低于40。这就是我正在努力解决的问题等等,你想有条件地打电话吗?这甚至不会真正减少代码。。您将拥有与现在相同的结构,但将
mov\inc\mov
替换为
call
。顺便说一句,你可以直接
inc fails
。我想做的是将failinc1减少到failinc8(这是8个独立的),使用一个被调用的函数,并返回到调用它的地址。编辑-添加故障2以显示我的代码是什么。这将重复8次,而不是
包含过程
,您可能需要使用
包含dword过程
,具体取决于您的汇编程序。