반복문

namu·2022년 6월 29일

특정 조건을 만족할 때까지 반복해서 실행

ex) Hello World를 10번 출력해야 한다면?

	mov ecx, 10 ; 통상적으로 카운팅과 관련된 건 ecx를 사용
    
LABEL_LOOP:
    PRINT_STRING msg
    NEWLINE
    dec ecx ; sub ecx, 1과 동일하지만 좀 더 빨리 동작
    cmp ecx, 0
    jne LABEL_LOOP
    
section.data
	msg db 'Hello World', 0x00

연습 문제) 1에서 100까지의 합을 구하는 프로그램 1+...+100 = ?

	mov eax, 100 ; 최종 목적지
	xor ebx, ebx ; mov ebx, 0 ebx : 결과물
	xor ecx, ecx

LABEL_SUM:
	inc ecx ; add ecx, 1과 동일
    add ebx, ecx ; ebx = ebx + ecx
    cmp ecx, eax
    jne LABEL_SUM
    
    PRINT_DEC 4, ebx
    NEWLINE

ecx를 사용하지 않고 만든다면?

	mov eax, 100 ; 최종 목적지
	xor ebx, ebx ; mov ebx, 0 ebx : 결과물

LABEL_SUM:
	add ebx, eax
    dec eax
    cmp eax, 0
    jne LABEL_SUM
    
    PRINT_DEC 4, ebx
    NEWLINE

어셈블리어에서 cmp와 jump를 사용한 반복문을 좀 더 간단하게 하기 위한 별도의 문법이 존재한다.
C++로 코드를 만들어서 빌드 후 어셈블리 코드를 열어보면 가끔 등장하는 문법이다.

loop [라벨]

  • ecx에 반복 횟수
  • loop할 때마다 ecx 1 감소. 0이면 빠져나감. 아니면 라벨로 이동
	mov ecx, 100
    xor ebx, ebx
LABEL_LOOP_SUM:
	add ebx, ecx
    loop LABEL_LOOP_SUM
    
    PRINT DEC 4, ebx
    NEWLINE
profile
안녕하세요

0개의 댓글