Menu
Coddy logo textTech

실습: 레지스터 값 교환

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

때때로 두 레지스터 간의 값을 서로 바꿔야 할 때가 있습니다. 예를 들어, rax에 5가 들어 있고 rbx에 10이 들어 있다면, 값을 바꾼 후에는 rax는 10이 되고 rbx는 5가 되어야 합니다.

한두 개의 MOV 명령어로는 이 작업을 수행할 수 없습니다. 임시 저장소로 사용할 세 번째 레지스터가 필요합니다.

직접 할 수 없는 이유:

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

올바른 방법 — 임시 레지스터 사용:

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

단계별 설명:

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

이 세 가지 명령어가 실행된 후, 값들이 서로 바뀝니다. 임시 레지스터 rcx는 여전히 원래 값(5)을 포함하고 있지만, 이는 괜찮습니다.

임시 레지스터는 사용하지 않는 어떤 레지스터든 될 수 있습니다:

  • rcx, rdx, r8 또는 사용 가능한 모든 레지스터를 사용할 수 있습니다
  • 해당 레지스터의 원래 값이 필요하지 않은지만 확인하십시오

이것이 중요한 이유:

값을 바꾸는 것은 정렬 알고리즘과 데이터 조작에서 흔히 발생하는 작업입니다. 이는 MOV 명령어의 순서에 대해 신중하게 생각하도록 가르쳐 줍니다.

challenge icon

챌린지

r8r9 사이의 값을 서로 바꾸기 위한 어셈블리 코드 세 줄을 작성하세요.

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

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

코드 실행 후:

  • r8은 2가 되어야 합니다.
  • r9는 6이 되어야 합니다.

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

직접 해보기

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"       ; 학생의 swap 코드가 여기에 들어갑니다
    
    ; 출력을 위해 값 저장
    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실력 점검

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

기초의 모든 레슨