我有下面这段用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中试图计算的结果。 提前计算迭代次数会破坏整个目的,使实际循环成为多余。
当然了。div
比重复减法更有效,除非商很小,比如低于10左右,所以你应该使用 div
而不是循环。
顺便说一下,在这种情况下,使用那些愚蠢的MASM指令比使用FLAGS结果的 sub
你自己。 我想 .until edx < ebx
将组装成一个cmp jl (或) jb
? 不知道它是假设有符号还是无符号)。) 但是 cmp
是多余的,如果你把 sub
最后;它已经设置了FLAGS。
什么是 .untilcxz
到底是怎么做的? 它是否组装成一个 loop
递减ECX的指令? 还是只测试当前值? 还是用 jecxz
在一个 jmp
?
你也许可以滥用 .untilczx
通过修改循环内的ECX。 像 setl cl
或 setb cl
减法后将ECX的低字节设置为0或1,这取决于减法后的 sub
过零(有符号或无符号)。 当然 xor ecx,ecx
所以CL = ECX。
这看起来很傻,完全没有意义,但如果你只是想玩玩这些指令,我想你可以考虑一下。