Наиболее естественный способ адресации данных – это прямая адресация, когда адрес нужной ячейки памяти является частью команды, например: 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.