Birbal
Birbal

Reputation: 63

Unable to understand nested loops in assembly language

This is an exercise from assembly language for intel based computers by Irvine:

What will be the final value of EAX in this example?

   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

My solution is that eax =28 as initially ecx is set to 5, so L2 executes 5 times, so eax= 3+5*5=28. Then ecx becomes 0 and flow moves out of L2, but since ecx=0, L1 would not be repeated and it would move to the next line without repeating L1. So final value of eax=28. I know this is wrong, but can someone tell where is the fault in my thinking?

Upvotes: 0

Views: 1764

Answers (1)

Shift_Left
Shift_Left

Reputation: 1243

You are correct and there is even a bigger problem in that this code would never end.

    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

So this code would be like the Energizer Bunny and go on forever and the result would be continually 28 over and over again.

    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

Now the program will at least end, but the result is still only going to be 28. If it needs to be 253 like I think the objective is, then you should be able to see the one instruction you need to move to make that happen.

Upvotes: 5

Related Questions