Montagem - Loops

A instrução JMP pode ser usada para implementar loops. Por exemplo, o seguinte fragmento de código pode ser usado para executar o corpo do loop 10 vezes.

MOV	CL, 10
L1:
<LOOP-BODY>
DEC	CL
JNZ	L1

O conjunto de instruções do processador, no entanto, inclui um grupo de instruções de loop para implementar a iteração. A instrução LOOP básica tem a seguinte sintaxe -

LOOP 	label

Onde, rótulo é o rótulo de destino que identifica a instrução de destino como nas instruções de salto. A instrução LOOP assume que oECX register contains the loop count. Quando a instrução de loop é executada, o registro ECX é decrementado e o controle salta para o rótulo de destino, até que o valor do registro ECX, ou seja, o contador atinge o valor zero.

O snippet de código acima pode ser escrito como -

mov ECX,10
l1:
<loop body>
loop l1

Exemplo

O programa a seguir imprime o número de 1 a 9 na tela -

section	.text
   global _start        ;must be declared for using gcc
	
_start:	                ;tell linker entry point
   mov ecx,10
   mov eax, '1'
	
l1:
   mov [num], eax
   mov eax, 4
   mov ebx, 1
   push ecx
	
   mov ecx, num        
   mov edx, 1        
   int 0x80
	
   mov eax, [num]
   sub eax, '0'
   inc eax
   add eax, '0'
   pop ecx
   loop l1
	
   mov eax,1             ;system call number (sys_exit)
   int 0x80              ;call kernel
section	.bss
num resb 1

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

123456789: