MOV 메모리에서 레지스터로
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 17번째.
지금까지는 숫자를 레지스터로 직접 이동하고(즉시값), 레지스터 간에 값을 복사했습니다. 이제 memory에서 레지스터로 데이터를 불러오는 방법을 배웁니다.
이것이 중요한 이유:
0장에서 배운 내용을 기억하세요. CPU는 메모리와 직접 작업할 수 없습니다. 먼저 데이터를 레지스터로 불러와야 합니다. 다음과 같이 하면 됩니다.
구문:
mov register, [address]대괄호 [ ]는 다음을 의미합니다: "이 memory address로 이동하여 그곳에 stored된 값을 가져옵니다."
다음과 같이 생각해 보세요:
메모리 address number에 상자가 하나 있다고 상상해 보세요. 그 상자 안에는 값이 있으며, 예를 들어 숫자 5가 들어 있습니다. 다음과 같이 작성하면:
mov al, [number] ; 메모리 주소 "number"의 값을 al에 로드합니다CPU에 다음과 같이 말하는 것입니다. " number라고 불리는 상자로 가서, 그 안에 있는 값(이 경우에는 5)을 가져와 al 레지스터에 복사해."
이 명령이 실행되면 값 5는 이제 al에 저장됩니다. 주소 number의 상자 안에 있던 원래 값은 그대로 남아 있습니다. 제거되지 않습니다.
중요한 규칙:
| 규칙 | 설명 |
|---|---|
| 소스는 memory address여야 함 | [label] 또는 [address] |
| 대괄호는 필수임 | mov al, myNumber는 값을 불러오는 것이 아니라 address를 불러옴 |
| 크기가 일치해야 함 | memory에 바이트가 저장되어 있다면 al을 사용해야 함(rax가 아님) |
흔한 실수:
; 잘못됨: myNumber의 ADDRESS를 로드하며, 값이 아님
mov al, myNumber
; 올바름: myNumber에 저장된 VALUE를 로드함
mov al, [myNumber]챌린지
메모리 주소 value의 값을 al 레지스터로 로드하는 어셈블리 한 줄을 작성하세요.
직접 해보기
section .data
msg db 'al = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; 학생의 코드가 먼저 실행됩니다 (al에 값을 로드합니다)
%include "solution.asm"
; al에서 값을 저장합니다
mov r12, rax
; "al = "를 출력합니다
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; al의 값을 출력합니다
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 플레이그라운드