如何使用convert .while循环转换为.repeat .untilcxz循环?

问题描述 投票:0回答:1

我有以下采用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   
assembly masm
1个回答
0
投票

重复减法循环的跳闸计数是您尝试在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 clsetb cl一样,取决于sub是否越过零(有符号或无符号),将ECX的低字节设置为0或1。当然,xor ecx,ecx在循环之前,所以CL = ECX。

这似乎很愚蠢,完全没有意义,但是我想,如果您只想使用这些指令,可以考虑一下。

© www.soinside.com 2019 - 2024. All rights reserved.