Сборка - петли

Инструкцию JMP можно использовать для реализации циклов. Например, следующий фрагмент кода можно использовать для выполнения тела цикла 10 раз.

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

Однако набор команд процессора включает в себя группу команд цикла для реализации итерации. Базовая инструкция LOOP имеет следующий синтаксис -

LOOP 	label

Где метка - это целевая метка, которая идентифицирует целевую инструкцию, как в инструкциях перехода. Инструкция LOOP предполагает, чтоECX register contains the loop count. Когда команда цикла выполняется, регистр ECX уменьшается, и управление переходит к целевой метке, пока значение регистра ECX, т. Е. Счетчик, не достигнет нулевого значения.

Приведенный выше фрагмент кода можно записать как -

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

пример

Следующая программа печатает цифры от 1 до 9 на экране -

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

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

123456789: