Assembly 如何将.while循环转换为.repeat.untlcxz循环?
我有以下英特尔汇编语言代码,我想用.repeat.until和.repeat.untilcxz指令编写循环。然而,我希望RHS上的一个实现了第一个指令,我问如何用正确的迭代次数加载ecx,以便在LHS上实现第二个指令 注意:我要问的代码实现了迭代减法的除法运算Assembly 如何将.while循环转换为.repeat.untlcxz循环?,assembly,masm,Assembly,Masm,我有以下英特尔汇编语言代码,我想用.repeat.until和.repeat.untilcxz指令编写循环。然而,我希望RHS上的一个实现了第一个指令,我问如何用正确的迭代次数加载ecx,以便在LHS上实现第二个指令 注意:我要问的代码实现了迭代减法的除法运算 重复减法循环的行程计数是您试图在EAX中计算的结果。提前计算迭代次数会破坏整个目的,并使实际循环变得多余 当然,div比重复减法更有效,除非商非常小,比如小于10左右,所以无论如何都应该使用div而不是循环 顺便说一句,在这种情况下,使
重复减法循环的行程计数是您试图在EAX中计算的结果。提前计算迭代次数会破坏整个目的,并使实际循环变得多余 当然,
div
比重复减法更有效,除非商非常小,比如小于10左右,所以无论如何都应该使用div
而不是循环
顺便说一句,在这种情况下,使用那些愚蠢的MASM指令比自己使用
sub
的标志结果效率要低。我假设。直到edx
将组装成cmp/jl(或jb
?IDK,如果它假设有符号或无符号)。但是如果将sub
放在最后,则cmp
是多余的;它已经设置了标志
.untlcxz
到底做什么?它是否汇编成减少ECX的循环
指令?还是只测试当前值?或者在jmp
上使用jecxz
通过修改循环内的ECX,您可能会滥用.untlczx
。类似于减法后的setl cl
或setb cl
,根据sub
是否过零(有符号或无符号),将ECX的低位字节设置为0或1。当然,xor ecx,ecx在循环之前,所以CL=ecx
这似乎很愚蠢,完全没有意义,但是如果你只想玩这些指令,你可以考虑它。
实际上,这是一本书中的练习,James T. Streib的《汇编语言指南,简明的介绍》,下面我来学习一些关于标题的概括,它问的问题与我在这里发布的问题相同。因此,我想知道如何对未分配的迭代次数使用.repeat.untilcxz指令。我猜解决方案是,mov ecx,edx.repeat.if ecx>ebx sub edx,ebx inc eax mov ecx,edx.endif.untilcxzmov 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
mov edx,eax
mov eax,0
.while edx >=
sub edx,ebx
inc eax
.endw