Команды работы с адресами и указателями
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