MOV: из памяти в регистр
Часть раздела Основы путешествия по Assembly на Coddy. Урок 17 из 45.
До сих пор ты перемещал числа непосредственно в регистры (непосредственная адресация) и копировал значения между регистрами. Теперь ты научишься загружать данные из памяти в регистр.
Почему это важно:
Помнишь из главы 0: инструкция может использовать не более одного операнда в памяти, а регистры намного быстрее памяти, поэтому ты загружаешь значения, с которыми работаешь, в регистры. Вот как это делается.
Синтаксис:
mov register, [address]Скобки [ ] означают: «перейди по этому адресу памяти и получи хранящееся там значение».
Представь себе это так:
Представь, что по адресу памяти number находится коробка. Внутри этой коробки лежит значение, например число 5. Когда ты пишешь:
mov al, [number] ; Load the value from memory address "number" into alВы говорите ЦП: «Перейди к ячейке под названием number, возьми любое значение внутри (в данном случае 5) и скопируй его в регистр al».
После выполнения этой инструкции значение 5 теперь хранится в al. Исходное значение в ячейке по адресу number остаётся там. Оно не удаляется.
Важные правила:
| Правило | Объяснение |
|---|---|
| Источник должен быть адресом памяти | [label] или [address] |
| Скобки обязательны | Без скобок 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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-64Потренируйтесь самостоятельно: Песочница Assembly