Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何将.while循环转换为.repeat.untlcxz循环?_Assembly_Masm - Fatal编程技术网

Assembly 如何将.while循环转换为.repeat.untlcxz循环?

Assembly 如何将.while循环转换为.repeat.untlcxz循环?,assembly,masm,Assembly,Masm,我有以下英特尔汇编语言代码,我想用.repeat.until和.repeat.untilcxz指令编写循环。然而,我希望RHS上的一个实现了第一个指令,我问如何用正确的迭代次数加载ecx,以便在LHS上实现第二个指令 注意:我要问的代码实现了迭代减法的除法运算 重复减法循环的行程计数是您试图在EAX中计算的结果。提前计算迭代次数会破坏整个目的,并使实际循环变得多余 当然,div比重复减法更有效,除非商非常小,比如小于10左右,所以无论如何都应该使用div而不是循环 顺便说一句,在这种情况下,使

我有以下英特尔汇编语言代码,我想用.repeat.until和.repeat.untilcxz指令编写循环。然而,我希望RHS上的一个实现了第一个指令,我问如何用正确的迭代次数加载ecx,以便在LHS上实现第二个指令

注意:我要问的代码实现了迭代减法的除法运算


重复减法循环的行程计数是您试图在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.untilcxz
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
mov edx,eax
mov eax,0
.while  edx >= 
sub edx,ebx
inc eax
.endw