다양한 크기의 MOV
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 20번째.
이미 al (8비트)과 rax (64비트)를 사용해 보셨습니다. 하지만 다른 크기들도 있습니다. 서로 다른 레지스터는 서로 다른 양의 데이터를 보유합니다.
x86-64 레지스터 패밀리:
| 레지스터 | 크기 | 비트 | 사용 시점 |
|---|---|---|---|
rax | 8 바이트 | 64 비트 | 전체 숫자, 주소, 시스템 호출(syscall) 번호 |
eax | 4 바이트 | 32 비트 | rax의 하위 절반 |
ax | 2 바이트 | 16 비트 | eax의 하위 절반 |
al | 1 바이트 | 8 비트 | ax의 하위 절반 (비트 0-7) |
ah | 1 바이트 | 8 비트 | ax의 상위 절반 (비트 8-15) |
동일한 패턴이 다른 레지스터에도 적용됩니다:
| 64비트 | 32비트 | 16비트 | 8비트 (하위) |
|---|---|---|---|
rbx | ebx | bx | bl |
rcx | ecx | cx | cl |
rdx | edx | dx | dl |
rsi | esi | si | sil |
rdi | edi | di | dil |
크기가 중요한 이유:
데이터를 이동할 때 소스와 대상의 크기가 일치해야 합니다. 일치하지 않으면 CPU는 다음과 같은 동작을 할 수 있습니다:
- 데이터의 일부만 복사함
- 알 수 없는 메모리에서 추가 바이트를 복사함
- 오류를 발생시킴
크기가 일치하는 예시:
mov rax, 1000 ; 64비트에서 64비트로 (정상)
mov eax, 1000 ; 32비트에서 32비트로 (정상)
mov ax, 1000 ; 16비트에서 16비트로 (정상)
mov al, 5 ; 8비트에서 8비트로 (정상)크기가 일치하지 않을 때 발생하는 현상:
mov rax, 0x123456789ABC ; 64비트 값
mov al, 0xFF ; al은 0xFF를 가지며, rax의 나머지 비트는 변경되지 않은 상태로 유지됨작은 값을 더 큰 레지스터로 이동할 때, 상위 비트는 그대로 유지됩니다. 이는 예기치 않은 결과를 초래할 수 있습니다.
안전한 규칙:
지금까지 이 코스에서, 메모리의 모든 데이터는 1바이트입니다. 그렇기 때문에 rax가 아닌 al을 사용합니다.
데이터를 이동할 때 레지스터 크기는 메모리 크기와 일치해야 합니다:
- 1바이트 메모리 →
al,bl,cl등을 사용합니다. - 8바이트 메모리 →
rax,rbx,rcx등을 사용합니다.
제3장에서 다양한 메모리 크기에 대해 배울 것입니다.
챌린지
이미 생성된 다음과 같은 데이터 주소들이 있습니다:
source— 1바이트 값 (5)을 포함합니다.destination— 빈 공간 (1바이트)
다음 작업을 수행하는 어셈블리 코드 두 줄을 작성하세요:
source의 값을al로 로드합니다.al의 값을destination에 저장합니다.
직접 해보기
section .data
msg db 'destination = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; 학생의 코드가 먼저 실행됨 (source에서 로드하여 destination에 저장)
%include "solution.asm"
; destination에서 저장된 값을 로드
mov al, [destination]
; 이를 저장
mov r12, rax
; "destination = " 출력
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; 값 출력
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; 종료
mov rax, 60
mov rdi, 0
syscall이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.