MOV 레지스터에서 메모리로
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 18번째.
이제 메모리에서 레지스터로 데이터를 로드하는 방법을 알았으니, 그 반대의 경우인 레지스터에서 메모리로 데이터를 저장하는 것을 배우게 될 것입니다.
구문:
mov [address], register대괄호 [ ]는 "레지스터의 값을 이 메모리 주소에 저장하라"는 의미입니다.
이렇게 생각해 보세요:
메모리 주소 destination에 빈 상자가 있다고 상상해 보세요. 레지스터에 값이 들어 있습니다 (예를 들어, al에 숫자 7이 들어 있습니다).
다음과 같이 작성하면:
mov [destination], alCPU에게 다음과 같이 지시하는 것입니다: "al 레지스터(7)의 값을 가져와서 destination이라는 이름의 상자에 넣으세요."
이 명령어가 실행된 후, 메모리 주소 destination에는 이제 값 7이 포함됩니다. al에 있는 값은 그대로 유지되며 제거되지 않습니다.
예제:
mov al, 7 ; 7을 al 레지스터에 넣습니다
mov [destination], al ; al의 값을 메모리 주소 "destination"에 저장합니다참고: 이 연습에서 메모리의 데이터는 1바이트(8비트)입니다. 그렇기 때문에 al을 사용합니다. 이는 크기에 맞는 8비트 레지스터입니다. 레지스터 크기에 대해서는 나중에 더 자세히 배우게 될 것입니다.
중요 규칙:
| 규칙 | 설명 |
|---|---|
| 대괄호가 필요합니다 | mov destination, al은 틀린 표현입니다 |
| 대상(destination)은 메모리 주소여야 합니다 | [destination]과 같은 레이블을 사용하세요 |
| 크기가 일치해야 합니다 | 이 연습에서는 al (8비트)을 사용하세요 |
흔히 하는 실수:
; 틀림: 대괄호 누락
mov destination, al
; 올바름: 메모리에 값을 저장함
mov [destination], al아래의 챌린지에서, 메모리 주소 destination은 이미 생성되어 있습니다. 3장에서는 자신만의 데이터를 생성하는 방법을 배우게 됩니다. 지금은 MOV 명령어에만 집중하세요.
챌린지
다음 작업을 수행하는 어셈블리 코드 두 줄을 작성하세요:
- 숫자 9를
al레지스터에 넣습니다. al의 값을 메모리 주소destination에 저장합니다.
(메모리 주소 destination은 이미 생성되어 있습니다.)
직접 해보기
section .data
msg db 'destination = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; solution.asm이 여기에 포함됩니다
; 이것은 destination과 학생의 MOV 명령어를 정의합니다
%include "solution.asm"
; 출력을 위해 메모리에 저장된 값을 al로 로드합니다
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.