为什么这个for循环在Assembly循环中这么多次?

时间:2014-04-01 03:19:11

标签: loops assembly

书中的问题显示了以下循环:

    mov ecx, -1
forD: .
      .                ; loop body
      .
      loop forD

问题是"每个循环体执行了多少次?"书后面的答案是4,294,967,295,但为什么呢?这个号码的重要性是什么?这应该是一个永无止境的循环吗?

2 个答案:

答案 0 :(得分:2)

-1在32位2's complement中为0xFFFFFFFF,在无符号十进制中为4294967295

循环时间取决于循环体。但是在目前的CPU中,你可以在几秒或更短的时间内运行几十亿次短循环

答案 1 :(得分:2)

loop的工作原理如下:

  1. 递减(e)cx 1
  2. 检查是否为0
  3. 如果没有,跳转到指定的偏移/标签
  4. 如果为0,则继续下一条指令
  5. -1等于4294967295 unsigned,这反过来导致循环迭代次数。

    使用loop有一些捕获:

    • Loop 首先减少了计数器寄存器。放置0不会导致重复为零,而是4294967296,因为第一次减少将会导致-1中的(e)cx。因此,将1放在那里将导致零重复。请注意,如果循环目标位于循环指令之前,这仍然会执行循环指令。

    • Loop是一个2字节的操作码。对于指令本身,第一个字节是E2,因此跳转目标偏移量只剩下一个字节。该偏移量已签名,因此您只能在-128..127字节的距离内循环。