실습: 레지스터 값 교환
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 | 명령어 | rax | rbx | rcx |
|---|---|---|---|---|
| 시작 | (코드 실행 전) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
이 세 명령어가 실행되면 값이 교환됩니다. 임시 레지스터 rcx에는 여전히 original 값(5)이 들어 있지만, 괜찮습니다.
temporary 레지스터는 사용하고 있지 않은 어떤 레지스터든 될 수 있습니다:
rcx,rdx,r8또는 사용 가능한 어떤 레지스터든 사용할 수 있습니다- 단, 해당 레지스터의 original 값이 필요하지 않은지 확인하세요
이것이 중요한 이유:
values을 Swap하는 것은 정렬 알고리즘과 data 조작에서 흔히 수행되는 작업입니다. 이를 통해 MOV 명령어의 순서를 신중하게 생각하는 법을 배울 수 있습니다.
챌린지
r8와 r9 사이의 값을 교환하는 어셈블리 코드를 세 줄 작성하세요.
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드