Сборка - Режимы адресации

Большинство инструкций на ассемблере требуют обработки операндов. Адрес операнда указывает место, где хранятся обрабатываемые данные. Некоторые инструкции не требуют операнда, тогда как некоторые другие инструкции могут требовать один, два или три операнда.

Когда инструкция требует двух операндов, первый операнд обычно является адресатом, который содержит данные в регистре или ячейке памяти, а второй операнд является источником. Источник содержит либо данные, которые должны быть доставлены (немедленная адресация), либо адрес (в регистре или памяти) данных. Как правило, исходные данные остаются неизменными после операции.

Три основных режима адресации:

  • Регистрация адресации
  • Немедленное обращение
  • Адресация памяти

Регистрация адресации

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

Например,

MOV DX, TAX_RATE   ; Register in first operand
MOV COUNT, CX	   ; Register in second operand
MOV EAX, EBX	   ; Both the operands are in registers

Поскольку обработка данных между регистрами не требует памяти, она обеспечивает самую быструю обработку данных.

Немедленное обращение

Непосредственный операнд имеет постоянное значение или выражение. Когда команда с двумя операндами использует немедленную адресацию, первый операнд может быть регистром или ячейкой памяти, а второй операнд - непосредственной константой. Первый операнд определяет длину данных.

Например,

BYTE_VALUE  DB  150    ; A byte value is defined
WORD_VALUE  DW  300    ; A word value is defined
ADD  BYTE_VALUE, 65    ; An immediate operand 65 is added
MOV  AX, 45H           ; Immediate constant 45H is transferred to AX

Прямая адресация памяти

Когда операнды указаны в режиме адресации памяти, требуется прямой доступ к основной памяти, обычно к сегменту данных. Такой способ адресации приводит к более медленной обработке данных. Чтобы определить точное местоположение данных в памяти, нам нужен начальный адрес сегмента, который обычно находится в регистре DS, и значение смещения. Это значение смещения также называетсяeffective address.

В режиме прямой адресации значение смещения указывается непосредственно как часть инструкции, обычно указывается именем переменной. Ассемблер вычисляет значение смещения и поддерживает таблицу символов, в которой хранятся значения смещения всех переменных, используемых в программе.

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

Например,

ADD	BYTE_VALUE, DL	; Adds the register in the memory location
MOV	BX, WORD_VALUE	; Operand from the memory is added to register

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

В этом режиме адресации для изменения адреса используются арифметические операторы. Например, посмотрите следующие определения, которые определяют таблицы данных:

BYTE_TABLE DB  14, 15, 22, 45      ; Tables of bytes
WORD_TABLE DW  134, 345, 564, 123  ; Tables of words

Следующие операции обращаются к данным из таблиц в памяти в регистры:

MOV CL, BYTE_TABLE[2]	; Gets the 3rd element of the BYTE_TABLE
MOV CL, BYTE_TABLE + 2	; Gets the 3rd element of the BYTE_TABLE
MOV CX, WORD_TABLE[3]	; Gets the 4th element of the WORD_TABLE
MOV CX, WORD_TABLE + 3	; Gets the 4th element of the WORD_TABLE

Косвенная адресация памяти

Этот режим адресации использует возможность компьютера Сегментная: Смещенная адресация. Обычно для этой цели используются базовые регистры EBX, EBP (или BX, BP) и индексные регистры (DI, SI), закодированные в квадратных скобках для ссылок на память.

Косвенная адресация обычно используется для переменных, содержащих несколько элементов, таких как массивы. Начальный адрес массива хранится, скажем, в регистре EBX.

В следующем фрагменте кода показано, как получить доступ к различным элементам переменной.

MY_TABLE TIMES 10 DW 0  ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE]     ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110          ; MY_TABLE[0] = 110
ADD EBX, 2              ; EBX = EBX +2
MOV [EBX], 123          ; MY_TABLE[1] = 123

Инструкция MOV

Мы уже использовали инструкцию MOV, которая используется для перемещения данных из одного места хранения в другое. Инструкция MOV принимает два операнда.

Синтаксис

Синтаксис инструкции MOV -

MOV  destination, source

Инструкция MOV может иметь одну из следующих пяти форм:

MOV  register, register
MOV  register, immediate
MOV  memory, immediate
MOV  register, memory
MOV  memory, register

Обратите внимание, что -

  • Оба операнда в операции MOV должны быть одинакового размера.
  • Значение исходного операнда остается неизменным.

Инструкция MOV иногда вызывает двусмысленность. Например, посмотрите на утверждения -

MOV  EBX, [MY_TABLE]  ; Effective Address of MY_TABLE in EBX
MOV  [EBX], 110	      ; MY_TABLE[0] = 110

Неясно, хотите ли вы переместить байтовый эквивалент или словарный эквивалент числа 110. В таких случаях целесообразно использовать type specifier.

В следующей таблице показаны некоторые из общих спецификаторов типов -

Указатель типа Адресованных байтов
БАЙТ 1
СЛОВО 2
DWORD 4
QWORD 8
ТБайт 10

пример

Следующая программа иллюстрирует некоторые концепции, обсужденные выше. Он сохраняет имя «Зара Али» в разделе данных памяти, затем программно меняет его значение на другое имя «Нуха Али» и отображает оба имени.

section	.text
   global _start     ;must be declared for linker (ld)
_start:             ;tell linker entry point
	
   ;writing the name 'Zara Ali'
   mov	edx,9       ;message length
   mov	ecx, name   ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	[name],  dword 'Nuha'    ; Changed the name to Nuha Ali
	
   ;writing the name 'Nuha Ali'
   mov	edx,8       ;message length
   mov	ecx,name    ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	eax,1       ;system call number (sys_exit)
   int	0x80        ;call kernel

section	.data
name db 'Zara Ali '

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

Zara Ali Nuha Ali