MOV 레지스터에서 메모리로
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 18번째.
이제 메모리에서 레지스터로 data를 Load하는 방법을 알았으므로, 그 반대인 레지스터의 data를 메모리에 Store하는 방법을 배우게 됩니다.
구문:
mov [address], registerbrackets [ ]은 다음을 의미합니다. "register의 값을 이 memory address에 저장합니다."
이렇게 생각해 보세요:
메모리 주소 destination에 빈 상자가 하나 있다고 상상해 보세요. 레지스터에 값이 들어 있습니다(예를 들어, al에는 숫자 7이 들어 있습니다).
다음과 같이 작성하면:
mov [destination], alCPU에 다음과 같이 지시하는 것입니다. "al 레지스터(7)의 값을 가져와 destination이라는 상자에 넣으세요."
이 명령이 실행된 후 메모리 주소 destination에는 이제 값 7이 들어 있습니다. al의 값은 그곳에 그대로 남아 있습니다. 제거되지 않습니다.
예:
mov al, 7 ; al 레지스터에 7을 넣습니다
mov [destination], al ; al의 값을 메모리 주소 "destination"에 저장합니다참고: 이 연습에서는 메모리의 data가 1바이트(8비트)입니다. 그래서 al을 사용합니다. 이는 크기가 일치하는 8비트 register입니다. 나중에 register 크기에 대해 더 자세히 배우게 됩니다.
중요한 규칙:
| 규칙 | 설명 |
|---|---|
| brackets는 필수입니다 | mov destination, al은 잘못되었습니다 |
| destination은 memory address여야 합니다 | [destination]과 같은 레이블을 사용하세요 |
| 크기가 일치해야 합니다 | 이 연습에서는 al(8비트)을 사용하세요 |
흔한 실수:
; 잘못됨: 괄호 누락
mov destination, al
; 올바름: 값을 메모리에 저장함
mov [destination], al아래 챌린지에서는 메모리 주소 destination이 이미 생성되어 있습니다. 자신만의 data를 만드는 방법은 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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드