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)После этих инструкций:
| Регистр | Значение |
|---|---|
| rax | 7 |
| rcx | 3 |
| rdx | 3 |
| rbx | 7 |
Почему это важно:
- Вы можете сохранить значение, скопировав его в другой регистр перед изменением оригинала
- Вы можете повторно использовать значения без повторной загрузки из памяти
- Это основа большинства операций ассемблера
Задание
Напишите код на ассемблере для следующих задач:
- Поместите число 4 в
rax - Скопируйте значение из
raxвrbx - Скопируйте значение из
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-64