мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
asm:memory [06/03/2012 20:39]
arabusov
asm:memory [06/02/2013 14:44] (текущий)
arabusov
Строка 1: Строка 1:
 ===== Адресация переменных ===== ===== Адресация переменных =====
  
-В общем случае адрес переменной или команды можно представить с помощью выражения вида <code>База + Индекс + Смещение</code>где база - регистры BX или BP, индекс - регистры SI или DI. Эти регистры так и называются: базовые и индексные. Смещение - это постоянное выражение.+В общем случае адрес переменной или команды можно представить с помощью выражения вида <code>База + Индекс + Смещение</code>где база - регистры RBX или RBP, индекс - регистры RSI или RDI. Эти регистры так и называются: базовые и индексные. Смещение - это постоянное выражение.
  
 Пример: Пример:
Строка 10: Строка 10:
  
 greet db 'Hello' greet db 'Hello'
- 
-_DATA ends 
 </code> </code>
 и инициализируем ds указанием на сегмент данных и инициализируем ds указанием на сегмент данных
-<code asm>section .code+<code asm>section .text
  
 mov ax,_DATA mov ax,_DATA
Строка 20: Строка 18:
  
 </code> </code>
-В результате выполнения следующих последовательностей команд в регистре al окажется символ 'o'((Для справки: как вывести содержимое регистра al на экран:<code asm>mov ah,0eh +В результате выполнения следующих последовательностей команд в регистре al окажется символ 'o'
-mov bh,0 +
-int 10h</code>))+
   - <code asm>   - <code asm>
 mov al,'o' mov al,'o'
Строка 35: Строка 31:
 mov al,[bx + si]</code> mov al,[bx + si]</code>
 В примерах со второго по пятый в al помещался 5-й символ массива greet, в первом в al помещался символ 'o', поэтому результат всех команд одинаковый. В примерах со второго по пятый в al помещался 5-й символ массива greet, в первом в al помещался символ 'o', поэтому результат всех команд одинаковый.
 +
 +===== Эффективные адреса NASM =====
 +Эффективный адрес — это любой операнд инструкции со ссылкой на память. Эффективные адреса в NASM имеют очень простой синтаксис: они содержат выражение (в результате вычислений которого получается нужный адрес), обрамленное квадратными скобками. Например: 
 +<code=asm>wordvar   dw 123 
 +     mov ax,[wordvar] 
 +     mov ax,[wordvar+1] 
 +     mov ax,[es:wordvar+bx]</code>
 +Любая другая ссылка, не соответствующая этой простой системе, для NASM недействительна, например es:wordvar[bx]. 
 +
 +Более сложные эффективные адреса, когда вовлечено более одного регистра, работают точно также: 
 +<code=asm>     mov eax,[ebx*2+ecx+offset] 
 +     mov ax,[bp+di+8]</code>
  
 ===== Стек ===== ===== Стек =====