반복문, 배열, 함수

반복문

어셈블리 언어에서 반복문의 구현은 두 가지 방법이 있다.
첫번째는 cmp, jmp를 이용하여 구현

CMAIN:
    ;1에서 100까지의 합을 구하는 문제
    ;ecx를 100에서 1씩 감소시키면서 eax에 더함
    mov ecx, 100
    mov eax, 0
    
LABEL_LOOP:
    add eax, ecx
    dec ecx
    cmp ecx, 0
    jne LABEL_LOOP
    
    PRINT_DEC 1, eax
    NEWLINE

두번째 방법은 loop문을 이용

CMAIN:
    mov ecx, 100
    xor ebx, ebx
    
LABEL_SUM:
    add ebx, ecx
    loop LABEL_SUM ; ecx를 1씩 감소시켜서 0이 되면 루프를 빠져나옴

배열

배열 선언 및 초기화

section .data
    a db 0x01, 0x02, 0x03, 0x04, 0x05 ; 1Byte * 5 = 5 Bytes
    b times 5 dw 1 ; 5 * 2 = 10Bytes

배열 순회 출력

CMAIN:
    mov rax, a
    xor ecx, ecx
    
LABEL_LOOP_A:
    ;배열의 데이터가 연속되어 저장되기 때문에 주소값을 1씩 올려 참조
    PRINT_DEC 1, [a+ecx]
    NEWLINE
    inc ecx
    cmp ecx, 5
    jne LABEL_LOOP_A
    
    xor ecx, ecx
LABEL_LOOP_B:
    ; B의 경우 word(2Bytes)로 선언되어 주소가 *2씩 건너뜀
    PRINT_DEC 2, [b+ecx*2] ; [시작 주소 + 인덱스 * 크기]
    NEWLINE
    inc ecx
    cmp ecx, 5 
    jne LABEL_LOOP_B

함수

두개의 입력값 중 큰값을 출력하는 함수

CMAIN:
    ;함수 (프로시저, 서브루틴)
    ;맥스값 출력 함수
    
    mov eax, 10
    mov ebx, 20
    
    call MAX ;call 문법으로 함수 호출
    PRINT_DEC 1, ecx
    NEWLINE
MAX:
    cmp eax, ebx
    jg L1
    mov ecx, ebx
    jmp L2
L1:
    mov ecx, eax
L2:
    ret
    
    xor rax, rax
    ret

좋은 웹페이지 즐겨찾기