书中的问题显示了以下循环:
mov ecx, -1
forD: .
. ; loop body
.
loop forD
问题是"每个循环体执行了多少次?"书后面的答案是4,294,967,295,但为什么呢?这个号码的重要性是什么?这应该是一个永无止境的循环吗?
答案 0 :(得分:2)
-1在32位2's complement中为0xFFFFFFFF,在无符号十进制中为4294967295
循环时间取决于循环体。但是在目前的CPU中,你可以在几秒或更短的时间内运行几十亿次短循环
答案 1 :(得分:2)
loop
的工作原理如下:
(e)cx
1 -1
等于4294967295 unsigned
,这反过来导致循环迭代次数。
使用loop
有一些捕获:
Loop
首先减少了计数器寄存器。放置0
不会导致重复为零,而是4294967296
,因为第一次减少将会导致-1
中的(e)cx
。因此,将1放在那里将导致零重复。请注意,如果循环目标位于循环指令之前,这仍然会执行循环指令。
Loop
是一个2字节的操作码。对于指令本身,第一个字节是E2
,因此跳转目标偏移量只剩下一个字节。该偏移量已签名,因此您只能在-128..127字节的距离内循环。