[C++]_S1-09_반복문

신치우·2023년 12월 13일

CPP

목록 보기
9/62

반복문은 분기문과 같이 가장 많이 쓰이는 부분이다.
단순 반복 혹은 조건확인 등을 여러번 반복해야할때 사용한다.

main:
    mov rbp, rsp; for correct debugging
    //; 반복문 (whille for)
    //; 특정 조건을 만족할때까지 반복해서 실행
    
    //; ex) Hello World를 10번 출력해야한다면?
    
    mov ecx, 10 //;  10번 돌릴꺼야 - 통상적으로 함수와 관련된건 ecx를 많이 사용함

LABEL_LOOP:
    PRINT_STRING msg
    NEWLINE
    dec ecx //; sub ecx, 1과 동일
    cmp ecx, 0
    jne LABEL_LOOP //; jump not equal - cmp의 결과가 0이 아니면 동작
    
    xor rax, rax
    ret


처음 ecx에 10을 부여하고 ecx의 값은 dec ecx를 통해 1씩 감소한다. 해당 방법으로 반복문을 진행한다.

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

main:
    mov rbp, rsp; for correct debugging
    ; 반복문 (whille for)
    ; 특정 조건을 만족할때까지 반복해서 실행
    
    mov ecx, 100 ; 100번 돌릴꺼야
    mov rax, 0;
    mov rbx, 0;
LABEL_LOOP:
    add rax, 1;
    add rbx, rax;
    
    dec ecx ; sub ecx, 1과 동일 - decrease 약자
    cmp ecx, 0
    jne LABEL_LOOP ; jump not equal - cmp의 결과가 0이 아니면 동작
    
    PRINT_DEC 1, rbx
    NEWLINE   
    xor rax, rax
    ret

내가 사용한 방식 : 변수 두개를 선언하고, rax는 1~100까지 움직이는 용도, rbx는 1~100까지 합을 누적하는 용도로 사용

아래는 강의에 나온 답안

    ; 연습 문제) 1에서 100까지의 합을 구하는 프로그램 1+2+3+4...+100 = ?
    mov eax, 100;
    xor ebx, ebx ; mov ebx, 0 이랑 동일
    xor ecx, ecx
LABEL_SUM:
    inc ecx ; dec의 반대 add ecx, 1
    add ebx, ecx
    cmp ecx, eax
    jne LABEL_SUM
    
    PRINT_DEC 4, ebx
    NEWLINE   
    xor rax, rax
    ret

dec의 반대가 되는게 있으거라고 생각했지만 찾아보지 않았었다. 반대는 inc이다 그리고 이전 강의에서 나왔던 xor을 이용하여 ebx, ecx0을 선언해준 줬다. 이런 부분들을 잘 기억해놓고 다음에 적용해봐야겠다.
그외 방법은 다양하게 있다.

loop 함수 사용방법

  • loop [라벨]
  • ecx에 반복 횟수
  • loop 할때마다 ecx 1감소, 0이면 빠져나감. 아니면 라벨로 이동
    mov ecx, 100
    xor ebx, ebx
LABEL_LOOP_SUM:
    add ebx, ecx
    loop LABEL_LOOPSUM

    PRINT_DEC 4, ebx
    NEWLINE 
    
    xor rax, rax
    ret

3가지 코드 모두 동일한 값을 출력한다.

오늘은 여기까지
회사 업무와 개인적인 일들로 할당량을 하나 채우지 못했다. 주말에 채워 넣겠습니다. 이제 어셈블리 강의가 3개 남았습니다. 이번주까지 어셈블리를 끝내고 다음주부턴 원래 목표했던 C++을 향해 가보도록 하겠습니다. 화이팅!

profile
https://shin8037.tistory.com/

0개의 댓글