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

Наиболее естественный способ адресации данных – это прямая адресация, когда адрес нужной ячейки памяти является частью команды, например: MOV АL, А

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

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

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

Например, в команде MOV АL, [DI] исполнительный адрес содержится в регистре DI; квадратные скобки указывают на то, что содержимое регистра DI является адресом некоторой ячейки памяти. Описанным способом можно использовать любой четырех регистров SI,DI,BX,BP.

Чтобы занести адрес в один из указанных регистров можно использовать конструкцию offset:

mov BX, offset AB

Благодаря присутствию здесь оператора offset в регистр BX загрузится адрес области памяти с именем АВ. Команда mov АX, [ВХ] занесет в регистр АХ (аккумулятор)значение 3145Н. Если дважды инкрементировать (т.е. увеличить на единицу) содержимое регистра ВХ и снова выполнить эту же команду в регистре АХ окажется значение 4456Н:

INC BX

INC BX

MOV AX, [BX]; в регистре АХ значение 4456Н.

Напишем простую программу, выполнение которой будем наблюдать в отладчике. Пусть в сегменте данных резервируется два слова. Запишем в первое слово значение 27FC, во второе 573А.

dat SEGMENT; начало сегмента данных

A DW 2 dup(?)

dat ENDS; конец сегмента данных

ASSUME CS: cod, DS: dat

cod SEGMENT; начало кодового сегмента

START: mov AX, dat; инициализация

mov DS,AX; сегментного регистра

mov A, 27FCH;запись числа в первое зарезервированное слово

mov A+2, 573AH; запись числа во второе зарезервированное слово

RET

cod ENDS; конец кодового сегмента

END START

Директива ASSUME

Директива ASSUME сообщает Ассемблеру назначение каждого сегмента. Так в директиве ASSUME приведенной программы показывается, что сегмент с именем cod является кодовым сегментом (в нем содержится программа), а сегмент с именем dat является сегментом данных и он соотносится с регистром DS.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: