movb // копировать 1 байт
movw // копировать 2 байтa
movl // копировать 4 байта
movq // копировать 8 байт
leaq data, %rbx // загрузить адрес переменной data в регистр rbx
~={yellow}Способы адресации=~
// Способ 1: прямая адресация
movw 0x402008, %ax // скопировать 2 байта (адрес 0x402008) в регистр ax
// или по метке
movw M, %ax
// Способ 2: косвенная адресация
// Предварительно загружаем адрес в регистр (3 способа)
movq $0x402008, %rbx
movq $M, %rbx
leaq M, %rbx
// Скопировать в регистр %ax значение из памяти по тому адресу
// который содержиться в регистре %rbx
movw (%rbx), %ax
// Можно указать базовое смещение адреса (положительное - вправо, отрицательное - влево)
movw 8(%rbx), %ax
// Можно указать текущее смещение предварительно загрузив его в регистр
leaq data, %rbx
movq $8, %rcx
movw 0(%rbx, %rcx), %ax
// Можно указать базовое и текущее смещение одновременно
movw 0(%rbx, %rcx), %ax
// Можно указать размер позиции смещения.
// Вот здесь он равен 2-ум байтам
movw 4(%rbx, %rcx, 2), %ax
~={yellow}Адресация относительно регистра rip=~
%rip - Re-Extended Instruction Pointer - указатель команд. Хранит адрес очередной команды, которая будет выполнена.
Если в качестве базового смещения относительно регистра %rip указана метка, то на место этой метки будет поставлено расстояние в байтах от значения %rip до того адреса, который обозначен данной меткой
movb data(%rip), %al
PIC (PIE) - Position Independent Code Это код, который не зависит от абсолютных адресов. Все ссылки на ячейки памяти относительные (например относительно счетчика команд). Этот код может быть размещен в любой области памяти. Может использоваться при создании динамических библиотек.