无法理解汇编语言中的嵌套循环

时间:2018-02-11 09:02:59

标签: assembly x86 nested-loops irvine32

这是Irvine基于英特尔计算机的汇编语言练习:

此示例中EAX的最终值是什么?

   mov eax,0
   mov ecx,10     ; outer loop counter
L1:
   mov eax,3
   mov ecx,5      ; inner loop counter
L2:
   add eax,5
   loop L2        ; repeat inner loop
   loop L1        ; repeat outer loop

我的解决方案是eax = 28,因为最初的ecx设置为5,所以L2执行5次,所以eax = 3 + 5 * 5 = 28。然后ecx变为0并且流程移出L2,但由于ecx = 0,L1不会重复,它将移动到下一行而不重复L1。所以eax的最终值= 28。我知道这是错的,但是有人能说出我的想法中的错误在哪里吗?

1 个答案:

答案 0 :(得分:5)

你是对的,甚至更大的问题是这段代码永远不会结束。

    mov     eax, 0              ; Unnecessary as next instruction changes this
L1: 
    mov     eax, 3
    mov     ecx, 5
L2: add     eax, 5
    loop    L2
    loop    L1                  ; ECX is decremented first

所以这段代码就像Energizer Bunny一样,永远继续下去,结果会一遍又一遍地持续下去。

    mov     eax, 0              ; Unnecessary as next instruction changes this
L1: push    ecx                 ; This and the pop below solves the problem
    mov     eax, 3
    mov     ecx, 5
L2: add     eax, 5
    loop    L2
    pop     ecx
    loop    L1                  ; ECX is decremented first

现在程序将至少结束,但结果仍然只有28个。如果它需要像我认为目标那样是253,那么你应该能够看到你需要移动到的一条指令让这种情况发生。