[libasm] Assembly - 반복문

Park Sejin·2021년 4월 13일
0

[libasm] nasm 어셈블러

목록 보기
11/12
post-thumbnail

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:

출처

tutorialspoint.com

0개의 댓글