Содержание

Адресация переменных

В общем случае адрес переменной или команды можно представить с помощью выражения вида

База + Индекс + Смещение

где база - регистры RBX или RBP, индекс - регистры RSI или RDI. Эти регистры так и называются: базовые и индексные. Смещение - это постоянное выражение.

Пример:

Определим массив переменных greet

section .data
 
greet db 'Hello'

и инициализируем ds указанием на сегмент данных

section .text
 
mov ax,_DATA
mov ds,ax

В результате выполнения следующих последовательностей команд в регистре al окажется символ 'o'

  1. mov al,'o'
  2. mov al,[greet+4]
  3. mov si, (offset greet) + 4
    mov al,[si]
  4. mov bx, offset greet + 4
    mov al,[bx]
  5. 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. Так же есть две команды

Разрядность операндов

Разрядность операндов операций со стеком в точности равна разрядности системы (например, в системе amd64 разрядность стековых операндов – 64)