Menu
Coddy logo textTech

실습: 레지스터 값 교환

Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 21번째.

때로는 두 레지스터 간의 값을 Swap해야 합니다. 예를 들어 rax에 5가 들어 있고 rbx에 10이 들어 있다면, Swap 후에는 rax가 10이고 rbx가 5여야 합니다.

MOV 명령어 하나 또는 두 개만으로는 이 작업을 할 수 없습니다. temporary storage로 사용할 세 번째 register가 필요합니다.

직접 할 수 없는 이유:

; 이것은 작동하지 않습니다
mov rax, rbx   ; 이제 rax = 10이지만, 원래의 5는 영원히 사라졌습니다
mov rbx, rax   ; 이제 rbx도 = 10입니다 (5가 아님)

올바른 방법: temporary 레지스터 사용:

mov rcx, rax   ; 1단계: 원래 rax를 rcx에 저장 (rcx = 5)
mov rax, rbx   ; 2단계: rbx를 rax에 복사 (rax = 10)
mov rbx, rcx   ; 3단계: rcx에서 저장한 값을 rbx에 복사 (rbx = 5)

단계별로:

Step명령어raxrbxrcx
시작(코드 실행 전)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

이 세 명령어가 실행되면 값이 교환됩니다. 임시 레지스터 rcx에는 여전히 original 값(5)이 들어 있지만, 괜찮습니다.

temporary 레지스터는 사용하고 있지 않은 어떤 레지스터든 될 수 있습니다:

  • rcx, rdx, r8 또는 사용 가능한 어떤 레지스터든 사용할 수 있습니다
  • 단, 해당 레지스터의 original 값이 필요하지 않은지 확인하세요

이것이 중요한 이유:

values을 Swap하는 것은 정렬 알고리즘과 data 조작에서 흔히 수행되는 작업입니다. 이를 통해 MOV 명령어의 순서를 신중하게 생각하는 법을 배울 수 있습니다.

challenge icon

챌린지

r8r9 사이의 값을 교환하는 어셈블리 코드를 세 줄 작성하세요.

Initial 값(테스트 하네스에서 제공):

  • r8은 6으로 시작합니다
  • r9는 2로 시작합니다

코드 실행 후:

  • r8은 2여야 합니다
  • r9는 6이어야 합니다

r10을 temporary 레지스터로 사용하세요.

직접 해보기

section .data
    msg_r8 db 'r8 = '
    msg_r8_len equ $ - msg_r8
    msg_r9 db 'r9 = '
    msg_r9_len equ $ - msg_r9
    newline db 0xa

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; 초기 값 설정
    mov r8, 6
    mov r9, 2
    
    %include "solution.asm"       ; 학생의 스왑 코드가 여기에 들어갑니다
    
    ; 출력을 위해 값 저장
    mov r12, r8
    mov r13, r9
    
    ; "r8 = " 출력
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r8
    mov rdx, msg_r8_len
    syscall
    
    ; r8 값 출력
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; 개행 출력
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; "r9 = " 출력
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r9
    mov rdx, msg_r9_len
    syscall
    
    ; r9 값 출력
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; 개행 출력
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; 종료
    mov rax, 60
    mov rdi, 0
    syscall
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨

직접 연습해 보세요: Assembly 플레이그라운드