===== Адресация переменных ===== В общем случае адрес переменной или команды можно представить с помощью выражения вида База + Индекс + Смещениегде база - регистры 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)