我有以下采用Intel汇编语言的代码,我想根据.repeat .until和.repeat .untilcxz指令编写循环。但是,我希望RHS上的代码能够实现第一条指令,并且我想问一下如何以正确的迭代次数加载ecx以在LHS上实现第二条指令?
注:我要查询的代码根据迭代减法实现除法运算。
mov eax,x mov eax,x
mov edx,eax mov edx,eax
mov ebx,y mov ebx,y
mov eax,0 mov eax,0
mov ecx,?? .repeat
.repeat sub edx,ebx
sub edx,ebx inc eax
inc eax .until edx < ebx
.untilcxz
与while循环代码等效,写为,
mov edx,eax
mov eax,0
.while edx >=
sub edx,ebx
inc eax
.endw
重复减法循环的跳闸计数是您尝试在EAX中计算的结果。提前计算迭代计数会破坏整个目的,并使其在实际循环中变得多余。
当然,除非商非常小,例如小于10左右,否则div
比重复减法更有效,因此无论如何都应使用div
而不是完全循环。
BTW,在这种情况下,使用那些愚蠢的MASM指令比使用自己的sub
的FLAGS结果效率低。我假设.until edx < ebx
将汇编为cmp / jl(如果假定为有符号或无符号,则为jb
?IDK)。但是,如果您将cmp
放在最后,则sub
是多余的;它已经设置了FLAGS。
.untilcxz
到底做什么?它是否汇编为减少ECX的loop
指令?还是只测试当前值?还是在jecxz
上使用jmp
?
您可能会通过在循环内修改ECX来滥用.untilczx
。像减法之后的setl cl
或setb cl
一样,取决于sub
是否越过零(有符号或无符号),将ECX的低字节设置为0或1。当然,xor ecx,ecx
在循环之前,所以CL = ECX。
这似乎很愚蠢,完全没有意义,但是我想,如果您只想使用这些指令,可以考虑一下。