MOV 메모리에서 레지스터로
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 17번째.
지금까지 여러분은 숫자를 레지스터에 직접 이동시키고(immediate) 레지스터 간에 값을 복사했습니다. 이제 메모리에서 레지스터로 데이터를 로드하는 방법을 배우게 됩니다.
이것이 중요한 이유:
0장에서 배운 내용을 기억해 보세요: CPU는 메모리와 직접 작업할 수 없습니다. 데이터는 먼저 레지스터에 로드되어야 합니다. 그 방법은 다음과 같습니다.
구문:
mov register, [address]대괄호 [ ]는 "이 메모리 주소로 가서 그곳에 저장된 값을 가져오라"는 의미입니다.
이렇게 생각해 보세요:
메모리 주소 number에 상자가 하나 있다고 상상해 보세요. 그 상자 안에는 예를 들어 숫자 5와 같은 값이 들어 있습니다. 다음과 같이 작성하면:
mov al, [number] ; 메모리 주소 "number"에서 값을 al로 로드합니다CPU에게 다음과 같이 지시하는 것입니다: "number라고 불리는 상자로 가서, 그 안에 들어있는 값(이 경우에는 5)을 가져와 al 레지스터에 복사하십시오."
이 명령이 실행된 후, 값 5는 이제 al에 저장됩니다. 주소 number에 있는 상자 안의 원래 값은 그대로 유지되며, 제거되지 않습니다.
중요한 규칙:
| 규칙 | 설명 |
|---|---|
| 소스는 메모리 주소여야 합니다 | [label] 또는 [address] |
| 대괄호가 필요합니다 | mov al, myNumber는 값이 아니라 주소를 로드합니다 |
| 크기가 일치해야 합니다 | 메모리에 바이트가 저장된 경우 al을 사용하십시오 (rax가 아님) |
흔히 하는 실수:
; 틀림: myNumber의 값이 아닌 주소를 로드함
mov al, myNumber
; 옳음: myNumber에 저장된 값을 로드함
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.