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

Bir*_*bal 0 x86 assembly 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
Run Code Online (Sandbox Code Playgroud)

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

Shi*_*eft 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
Run Code Online (Sandbox Code Playgroud)

所以这段代码就像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
Run Code Online (Sandbox Code Playgroud)

现在程序至少会结束,但结果仍然只有28个.如果它需要像我认为目标那样是253,那么你应该能够看到你需要移动的一条指令来实现这一目标.

  • @Birbal删除所有行,问题解决了.如果代码需要返回10*5*3的值,则删除所有代码,并使用`mov eax,150`,问题解决了.如果你没有抓住我的漂移,没有解释+修复要求,应该是什么结果,没有办法解决它,因为不清楚在内循环中应该做什么`mov eax,3`.总体上迫使学生以这种方式学习嵌套循环有点缺乏想象力和目的.可能宁愿告诉你如何填充MxN数组,每一行都是0123 ...但是+1代表第一个值(第二行123 ..,第三个234 ......). (2认同)