мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

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

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

Следующая версия
Предыдущая версия
Последняя версияСледующая версия справа и слева
asm:memory [06/03/2012 20:38] – создано arabusovasm:memory [06/02/2013 14:43] arabusov
Строка 1: Строка 1:
 ===== Адресация переменных ===== ===== Адресация переменных =====
  
-В общем случае адрес переменной или команды можно представить с помощью выражения вида <code>База + Индекс + Смещение</code>где база - регистры BX или BP, индекс - регистры SI или DI. Эти регистры так и называются: базовые и индексные. Смещение - это постоянное выражение.+В общем случае адрес переменной или команды можно представить с помощью выражения вида <code>База + Индекс + Смещение</code>где база - регистры RBX или RBP, индекс - регистры RSI или RDI. Эти регистры так и называются: базовые и индексные. Смещение - это постоянное выражение.
  
 Пример: Пример:
Строка 7: Строка 7:
 Определим массив переменных greet Определим массив переменных greet
 <code asm> <code asm>
-_DATA segment word public "DATA"+section .data
  
 greet db 'Hello' greet db 'Hello'
- 
-_DATA ends 
 </code> </code>
 и инициализируем ds указанием на сегмент данных и инициализируем ds указанием на сегмент данных
-<code asm> +<code asm>section .text
-_CODE segment word public "CODE"+
  
 mov ax,_DATA mov ax,_DATA
Строка 21: Строка 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'
Строка 36: Строка 31:
 mov al,[bx + si]</code> mov al,[bx + si]</code>
 В примерах со второго по пятый в al помещался 5-й символ массива greet, в первом в al помещался символ 'o', поэтому результат всех команд одинаковый. В примерах со второго по пятый в al помещался 5-й символ массива greet, в первом в al помещался символ 'o', поэтому результат всех команд одинаковый.
 +
 +===== Эффективные адреса =====
 +Эффективный адрес — это любой операнд инструкции со ссылкой на память. Эффективные адреса в 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>
  
 ===== Стек ===== ===== Стек =====