===== Адресация переменных =====
В общем случае адрес переменной или команды можно представить с помощью выражения вида База + Индекс + Смещение
где база - регистры RBX или RBP, индекс - регистры RSI или RDI. Эти регистры так и называются: базовые и индексные. Смещение - это постоянное выражение.
Пример:
Определим массив переменных greet
section .data
greet db 'Hello'
и инициализируем ds указанием на сегмент данных
section .text
mov ax,_DATA
mov ds,ax
В результате выполнения следующих последовательностей команд в регистре al окажется символ 'o'
-
mov al,'o'
- mov al,[greet+4]
- mov si, (offset greet) + 4
mov al,[si]
- mov bx, offset greet + 4
mov al,[bx]
- mov bx,offset greet
mov si,4
mov al,[bx + si]
В примерах со второго по пятый в al помещался 5-й символ массива greet, в первом в al помещался символ 'o', поэтому результат всех команд одинаковый.
===== Эффективные адреса NASM =====
Эффективный адрес — это любой операнд инструкции со ссылкой на память. Эффективные адреса в NASM имеют очень простой синтаксис: они содержат выражение (в результате вычислений которого получается нужный адрес), обрамленное квадратными скобками. Например:
wordvar dw 123
mov ax,[wordvar]
mov ax,[wordvar+1]
mov ax,[es:wordvar+bx]
Любая другая ссылка, не соответствующая этой простой системе, для NASM недействительна, например es:wordvar[bx].
Более сложные эффективные адреса, когда вовлечено более одного регистра, работают точно также:
mov eax,[ebx*2+ecx+offset]
mov ax,[bp+di+8]
===== Стек =====
Стек - это структура, имеющая верхушку (top). Со стеком можно совершить две операции: //взять верхушку// и //положить в стек//.
В процессорах линейки x86 стек реализуется с помощью выделения специального сегмента, на верхушку указывает пара регистров //ss:rsp//. Так же есть две команды
* //push something// -- протолкнуть в стек //something//.
* //pop something// -- достать из стека //something//.
=== Разрядность операндов ===
Разрядность операндов операций со стеком в точности равна разрядности системы (например, в системе amd64 разрядность стековых операндов -- 64)