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
是独立递增的,你可以用一个加法替换8addebx,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过程
,具体取决于您的汇编程序。