실습: 레지스터 값 교환
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)단계별 설명:
| 단계 | 명령어 | 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는 여전히 원래 값(5)을 포함하고 있지만, 이는 괜찮습니다.
임시 레지스터는 사용하지 않는 어떤 레지스터든 될 수 있습니다:
rcx,rdx,r8또는 사용 가능한 모든 레지스터를 사용할 수 있습니다- 해당 레지스터의 원래 값이 필요하지 않은지만 확인하십시오
이것이 중요한 이유:
값을 바꾸는 것은 정렬 알고리즘과 데이터 조작에서 흔히 발생하는 작업입니다. 이는 MOV 명령어의 순서에 대해 신중하게 생각하도록 가르쳐 줍니다.
챌린지
r8와 r9 사이의 값을 서로 바꾸기 위한 어셈블리 코드 세 줄을 작성하세요.
초기 값 (테스트 하네스에서 제공):
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.