Команды работы с адресами и указателями

Push cs

Pop ds

Push ax

Mov ds, ax

Mov ax, 0000h

Mov mas1, al

Mov al, mas

Особенности пересылки данных

Переопределение сегмента

Косвенная по базе с индексированием

Косвенная адресация по базе

Прямая адресация с индексированием

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

Mov w1, 23h

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

Mov dw1, ecx

Регистровая и прямая адресация

Aw2 dw 10, 20

Ab db 1,2,3

Dw1 dd 3

W1 dw 0

B1 db 1

Data

Способы адресации памяти

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

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

Способы адресации

Db 0010000B

Db 20h

Db 32

db 10 dup (0) ; в память будет записано десять нулей

db 0ffh, 0f0h ; в памяти будет записано: FF F0

 

Для объявления константы используется 2 директивы:

 

KILO EQU 1024 ; килобайт представляет собой 1024

Константу объявленную EQU переопределять нельзя.

 

KILO=1024 ; можно по ходу программы переопределять константу

 

Часто в программе требуется найти длину массива:

mes DB ‘ЖДИТЕ’

meslen EQU $-mes ; вычисление константы

$ - возвращает адрес последнего байта, а метка mes – адрес начала массива

Регистры могут быть 8-битовые, 16-битовые или 32-битовые

Примеры:

mov ah, bh ; пересылка байта

mov di, bx ; пересылка слова

mov edx, ebx ; пересылка двойного слова

mov ax, bl ; ошибка (смещение типов)

 

 

В качестве операнда выступает константа.

Примеры:

mov eax,-2 ;расширение 2 до 32 разрядов

mov ds,60h ; ошибка (прямая загрузка запрещена)

.

В следующих примерах используем объявленный ниже сегмент данных:

 

 

Прямая адресация– это адресация с использованием имени.

 

mov сх, w1 ; сх обнуляется

 

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

mov [bx], al ; al загрузить по адресу, который находится в

:регистре bx

mov [si], ecx

mov dх, [ecx]

 

 

mov ab[di],0 ;Обнулить байт по адресу ab+[di]

mov sp,aw2[ecx]

mov byte ptr [bx]+2, 12 ;записать по адресу [bx]+2 число 12

mov byte ptr 2[bx], 12 ;можно так

mov dx, [eax+2]

mov [ebp*4+2], esi

mov al, [bp] + [si]

mov word ptr [eax+esi], 4

mov ebp, [ecx+edi*4]

mov ab3 [ebx+edx+2], dh

mov cx, [eax] [ebp+4] ; операнд находится в стеке

Следует имя регистра сегментации в операнде указать явно

mov byte ptr es:[800h+di],20h

1. Нельзя пересылать из одной области памяти в другую. Необходимо использовать буферный регистр:

2. Нельзя загружать сегментный регистр непосредственно из памяти, следует использовать промежуточный регистр или стек:

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

pop ds; читает из стека и записывает в DS

4. При пересылке следует учитывать размер операнда

mov ax, word ptr [bx] ; пересылка слова

inc word ptr [bx]

mov byte ptr [mas+1], 0ffh ;записать байт (ff) по адресу

xch ax, bx ; команда двунаправленного обмена

 

 

lea <назначение>, <источник> - загрузка эффективного адреса в регистр общего назначения

Имя регистра назначения указывается в команде, в него записывается эффективный адрес.

 

Загрузка полного указателя в сегментный регистр и регистр общего назначения.

 

lds <назначение>, <источник>

les <назначение>, <источник>

lgs <назначение>, <источник>

lfs <назначение>, <источник>

lss <назначение>, <источник>

.

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

 

Пример

.data

str db ‘Assembler’

:

.

full dd str ;выделяется 2 слова для записи полного адреса массива

:

.

les bx, full ; в регистры bx и es записан полный адрес переменной str

 

lea bx, str ; в регистр bx загрузить эффективный адрес str