Menu
CoddyTech

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]
challenge icon

Задание

Напиши одну строку на языке ассемблера, чтобы загрузить значение из ячейки памяти 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Песочница Assembly