다양한 크기의 MOV
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 20번째.
이미 al(8비트)과 rax(64비트)를 사용해 보았습니다. 하지만 다른 크기도 있습니다. 서로 다른 레지스터는 서로 다른 양의 data를 담습니다.
x86-64 레지스터 패밀리:
| 레지스터 | 크기 | bits | 사용 시기 |
|---|---|---|---|
rax | 8 bytes | 64 bits | 전체 숫자, 주소, syscall 번호 |
eax | 4 bytes | 32 bits | rax의 하위 절반 |
ax | 2 bytes | 16 bits | eax의 하위 절반 |
al | 1 byte | 8 bits | ax의 하위 절반(bits 0-7) |
ah | 1 byte | 8 bits | ax의 상위 절반(bits 8-15) |
동일한 패턴이 다른 레지스터에도 적용됩니다:
| 64비트 | 32비트 | 16비트 | 8비트 (low) |
|---|---|---|---|
rbx | ebx | bx | bl |
rcx | ecx | cx | cl |
rdx | edx | dx | dl |
rsi | esi | si | sil |
rdi | edi | di | dil |
크기가 중요한 이유:
data를 이동할 때 source와 destination의 크기가 일치해야 합니다. 일치하지 않으면 CPU는 다음과 같은 동작을 할 수 있습니다:
- data의 일부만 복사
- 알 수 없는 메모리에서 추가 바이트를 복사
- 오류 발생
일치하는 크기의 예:
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의 다른 비트들은 변경되지 않은 채로 유지됩니다더 작은 값을 더 큰 레지스터로 이동하면 upper bits는 그대로 stay합니다. 이로 인해 예상치 못한 결과가 발생할 수 있습니다.
안전한 규칙:
지금까지 이 과정에서는 메모리의 모든 데이터가 1바이트입니다. 그렇기 때문에 rax가 아니라 al을 사용합니다.
데이터를 이동할 때 메모리 크기와 레지스터 크기가 일치해야 합니다:
- 메모리 1바이트 →
al,bl,cl등을 사용합니다. - 메모리 8바이트 →
rax,rbx,rcx등을 사용합니다.
3장에서 다양한 메모리 크기에 대해 배우게 됩니다.
챌린지
다음 데이터 주소가 이미 생성되어 있습니다:
source: 1바이트 값(5)을 포함합니다destination: 비어 있는 공간(1바이트)
다음 작업을 수행하는 어셈블리 코드 두 줄을 작성하세요:
source에서 값을al로 Loadal의 값을destination에 Store
직접 해보기
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드