Регистры и перемещение данных
Обзор регистров
x86-64 имеет 16 регистров общего назначения 64-бит. Запись в 32-битный подрегистр (напр. eax) расширяет нулями старшие 32 бита полного регистра; запись в 16/8-битные подрегистры оставляет старшие биты без изменений.
; General-purpose 64-bit registers (x86-64)
; rax, rbx, rcx, rdx — main accumulators / scratch
; rsi, rdi — source/destination index (string ops)
; rbp, rsp — base pointer / stack pointer
; r8 .. r15 — extended registers
; 32-bit: eax, 32-bit: ecx, 16-bit: ax, 8-bit: al/ah
mov rax, 42 ; load immediate into 64-bit register
mov eax, 0x1F ; 32-bit move (zero-extends to rax)mov — перемещение данных
mov копирует данные между регистрами, памятью и непосредственными значениями. Перемещения память-в-память не разрешены — используйте регистр. Всегда указывайте размер (byte/word/dword/qword) при неоднозначности.
mov rax, 60 ; immediate -> register
mov rbx, rax ; register -> register
mov qword [rsp-8], 7 ; immediate -> memory (qword = 8 bytes)
mov rcx, [rsp-8] ; memory -> register
; INVALID: mov [rsp-8], [rsp-16] (memory-to-memory not allowed)
; Use two steps: mov rax, [src]; mov [dst], raxlea — загрузка эффективного адреса
lea вычисляет адрес операнда памяти без доступа к ней. Часто используется как быстрая арифметическая инструкция (умножение на 5/3/9 через масштаб+индекс) и для взятия адреса стековых переменных.