如何将.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个回答
1
投票

重复减法循环的行程数是你在EAX中试图计算的结果。 提前计算迭代次数会破坏整个目的,使实际循环成为多余。

当然了。div 比重复减法更有效,除非商很小,比如低于10左右,所以你应该使用 div 而不是循环。


顺便说一下,在这种情况下,使用那些愚蠢的MASM指令比使用FLAGS结果的 sub 你自己。 我想 .until edx < ebx 将组装成一个cmp jl (或) jb? 不知道它是假设有符号还是无符号)。) 但是 cmp 是多余的,如果你把 sub 最后;它已经设置了FLAGS。

什么是 .untilcxz 到底是怎么做的? 它是否组装成一个 loop 递减ECX的指令? 还是只测试当前值? 还是用 jecxz 在一个 jmp?

你也许可以滥用 .untilczx 通过修改循环内的ECX。 像 setl clsetb cl 减法后将ECX的低字节设置为0或1,这取决于减法后的 sub 过零(有符号或无符号)。 当然 xor ecx,ecx 所以CL = ECX。

这看起来很傻,完全没有意义,但如果你只是想玩玩这些指令,我想你可以考虑一下。

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