Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

x86 assembly programming loops with ecx and loop instruction versus jmp + j<condition>

i'm currently learning x86 assembly language and wondered what is the better way for implementing loops. One way would be to mov a value to ecx register and use the loop instruction and the other way would be using a jmp instruction and then comes the loop body and then a conditional jumping eventually to the beginning of the loop body. I guess the first one will has a better readability but other then that i don't know why to use it.

like image 936
rob Avatar asked Jul 24 '11 08:07

rob


People also ask

What is the purpose of the x86 assembly language jmp instruction?

In the x86 assembly language, the JMP instruction performs an unconditional jump. Such an instruction transfers the flow of execution by changing the program counter.

What is the meaning of jmp in assembly language?

Description. The jmp instruction transfers execution control to a different point in the instruction stream; records no return information. Jumps with destinations of disp[8|16|32] or r/m[16|32] are near jumps and do not require changes to the segment register value.

What is conditional jump in assembly language?

Conditional Jumps: Branching in Assembly A conditional jump instruction, like "je" (jump-if-equal), does a goto somewhere if the two values satisfy the right condition. For example, if the values are equal, subtracting them results in zero, so "je" is the same as "jz".

How jmp is different from Jnz?

JMP . is essentially an infinite loop as the code will keep jumping back to itself infinitely until you get an interrupt . The JNZ statement is a conditional jump statement which will work as JMP when the zero flag is not set ( Z = 0 ).


1 Answers

When you mention jmp+body+test, I believe you are talking about the translation of a while loop in high-level languages. There is a reason for the second approach. Let's take a look.

Consider

x = N
while (x != 0) {
    BODY
    x--
}

The naive way is

    mov ecx, N      ; store var x in ecx register
top:
    cmp ecx, 0      ; test at top of loop
    je bottom       ; loop exit when while condition false
    BODY
    dec ecx
    jmp top
bottom:

This has N conditional jumps and N unconditional jumps.

The second way is:

    mov ecx, N 
    jmp bottom
top:
    BODY
    dec ecx
bottom:
    cmp ecx, 0
    jne top

Now we still do N conditional jumps but we only do ONE unconditional jump. A small savings but it just might matter, especially because it is in a loop.

Now you did mention the loop instruction which is essentially

dec ecx
cmp ecx, 0
je somewhere

How would you work that in? Probably like this:

    mov ecx, N
    cmp ecx, 0       ; Must guard against N==0
    je bottom
top:
    BODY
    loop top         ; built-in dec, test, and jump if not zero
bottom:

This is a pretty little solution typical of CISC processors. Is it faster than the second way above? That depends a great deal on the architecture. I suggest you do some research on the performance of the loop instruction in the IA-32 and Intel 64 processor architectures, if you really want to know more.

like image 125
Ray Toal Avatar answered Sep 20 '22 09:09

Ray Toal