JMP 명령어를 반복문 구현에 사용할 수 있다. 예를 들어, 다음 코드는 loop-body를 10번 실행할 수 있다.
MOV CL, 10
L1:
<LOOP-BODY>
DEC CL
JNZ L1
하지만, 프로세서 명령어 세트에 반복을 구현하는 loop 명령어가 포함되어 있다. 기본 loop 명령어의 구문은 다음과 같다.
LOOP label
여기서, label은 JMP 명령과 같이 타겟 명령을 식별하는 label이다. LOOP 명령어는 ECX 레지스터가 loop 카운터를 포함한다고 가정한다. loop 명령어가 실행되면, ECX 레지스터는 감소하고 제어 흐름이 타겟 레이블로 점프한다. 이런 동작을 ECX 레지스터 값이 0이 될 때까지 반복한다.
위의 코드를 다음과 같이 작성할 수 있다.
MOV ECX, 10
l1:
<loop body>
loop l1
다음 프로그램은 1부터 9까지의 숫자를 출력한다.
❗️ 64비트 Intel macOS에서 동작하는 코드이다.
section .text
global _main
_main:
mov rcx, 10
mov eax, '1'
l1:
mov r10, num
mov [r10], eax
mov rax, 0x2000004
mov rdi, 1
push rcx
mov rsi, num
mov rdx, 1
syscall
mov eax, [r10]
sub eax, '0'
inc eax
add eax, '0'
pop rcx
loop l1
mov rax, 0x2000001
mov rdi, 1
syscall
section .bss
num resb 1
코드를 컴파일하고 실행하면 다음과 같은 결과를 확인할 수 있다.
123456789: