Menu
Coddy logo textTech

MOV: из регистра в регистр

Часть раздела Основы путешествия по Assembly на Coddy — урок 16 из 45.

Теперь, когда вы знаете, как поместить число непосредственно в регистр (MOV immediate), вы также можете копировать значения между регистрами.

Синтаксис:

mov destination_register, source_register

Значение из регистра source копируется в регистр destination. Регистр source остается без изменений.

Пример:

mov rax, 5      ; rax = 5
mov rbx, rax    ; rbx = 5 (скопировано из rax)

После этих двух инструкций и rax, и rbx содержат 5.

Важно: Исходный регистр (rax) по-прежнему сохраняет своё значение. MOV копирует — она не вырезает и не перемещает.

Другой пример:

mov rax, 7      ; rax = 7
mov rcx, 3      ; rcx = 3
mov rdx, rcx    ; rdx = 3 (скопировано из rcx)
mov rbx, rax    ; rbx = 7 (скопировано из rax)

После этих инструкций:

РегистрЗначение
rax7
rcx3
rdx3
rbx7

Почему это важно:

  • Вы можете сохранить значение, скопировав его в другой регистр перед изменением оригинала
  • Вы можете повторно использовать значения без повторной загрузки из памяти
  • Это основа большинства операций ассемблера
challenge icon

Задание

Напишите код на ассемблере для следующих задач:

  1. Поместите число 4 в rax
  2. Скопируйте значение из rax в rbx
  3. Скопируйте значение из rbx в rcx

После выполнения вашего кода все три регистра должны содержать 4.

Попробуйте сами

section .data
    msg_rax db 'rax = '
    msg_rax_len equ $ - msg_rax
    msg_rbx db 'rbx = '
    msg_rbx_len equ $ - msg_rbx
    msg_rcx db 'rcx = '
    msg_rcx_len equ $ - msg_rcx

section .bss
    digit resb 1

section .text
    global _start

_start:
    %include "solution.asm"
    
    ; Сохранить значения
    mov r12, rax
    mov r13, rbx
    mov r14, rcx
    
    ; Вывести "rax = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_rax
    mov rdx, msg_rax_len
    syscall
    
    ; Вывести значение rax
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Вывести "rbx = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_rbx
    mov rdx, msg_rbx_len
    syscall
    
    ; Вывести значение rbx
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Вывести "rcx = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_rcx
    mov rdx, msg_rcx_len
    syscall
    
    ; Вывести значение rcx
    mov rax, r14
    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Проверьте себя

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

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