Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
5.1 Режимы адресации [1]
1. Регистровый. Операнд (байт или слово) находится в регистре. Примеры:
inc CX
push DS
xchg BX,BP
mov ES,AX
2. Непосредственный. Операнд (байт или слово) указывается в команде. Он может иметь любой смысл (число, адрес, код ASCII), а также представлен в виде символического обозначения. Примеры:
mov AH,40h
mov AL,'*'
int 21h
limit equ 528
mov CX,limit
mov DX, offset mes
3. Прямой. Адресуется память (байт или слово). При любом обращении к памяти процессор использует один из сегментных регистров. Адрес ячейки памяти указывается в команде. Примеры:
;Сегмент данных, сегментный адрес в DS
mem dw 0
;Сегмент команд, сокращенная форма
inc mem;полная форма inc DS:mem
mov DX,mem;полная форма inc DX,DS:mem
Сокращение недопустимо для других сегментных регистров(ES, CS и т.д.). Например,
inc ES:mem
mov BX,ES:2Ch;эквивалент mov BX,ES:[2Ch]
4. Регистровый косвенный. Адресуется память (байт или слово). Относительный адрес операнда находится в регистрах ВХ или ВР (базовая адресация) или в регистрах SI или DI (индексная адресация). При использовании регистров BX, SI и DI подразумевается сегмент, адресуемый через DS, при использовании BP подразумевается сегмент стека и, соответственно, регистр SS:
[BX] (подразумевается DS:[BX])
[BP] (подразумевается SS:[BP])
[SI] (подразумевается DS:[SI])
[DI] (подразумевается DS:[DI])
Примеры:
mov AX,[SI]
inc [SI]
mov BX,[SI]
5. Регистровый косвенный со смещением. Адресуется память (байт или слово). Относительный адрес операнда определяется как сумма содержимого регистра BX, BP, SI или DI и указанной в команде константы, называемой смещением. Смещение может быть числом или адресом. При использовании регистров BX, SI и DI подразумевается сегмент, адресуемый через DS, при использовании BP подразумевается сегмент стека и, соответственно, регистр SS:
смещение[BX] (подразумевается DS:смещение[BX])
смещение [BP] (подразумевается SS: смещение [BP])
смещение [SI] (подразумевается DS: смещение [SI])
смещение [DI] (подразумевается DS: смещение [DI])
Допустимы также обозначения вида:
[BX]+смещение
[BX+смещение]
Пусть в сегменте данных определен массив из 10 чисел
array db 0,10,20,30,40,50,60,70,80,90
Последовательность команд
mov BX,5
mov AL,array[BX]
загрузит в регистр AL элемент массива с индексом 5, т.е. число 50.
Тот же результат дадут команды
mov BX,offset array
mov AL,5[BX];или AL,[BX]+5 или AL,[BX+5]
6. Базовый индексный. Адресуется память (байт или слово). Относительный адрес определяется как сумма содержимого следующих пар регистров
[BX][SI] (подразумевается DS:[BX][SI])
[BX][DI] (подразумевается DS:[BX][DI])
[BP][SI] (подразумевается SS:[BP][SI])
[BP][DI] (подразумевается SS:[BP][DI])
Пусть в сегменте данных определен массив из 10 слов:
Words dw 0,10,20,30,40,50,60,70,80,90
Последовательность команд
mov BX,offset words
mov SI,10
mov AX,[BX][SI]
загрузит в регистр слово со смещением 10 байтов от начала массива, т.е. число 50.
7. Базовый индексный со смещением. Адресуется память (байт или слово). Относительный адрес определяется как сумма содержимого двух регистров и смещения.
смещение[BX][SI] (подразумевается DS:смещение[BX][SI])
смещение[BX][DI] (подразумевается DS:смещение[BX][DI])
смещение[BP][SI] (подразумевается SS:смещение[BP][SI])
смещение[BP][DI] (подразумевается DS:смещение[BP][DI])
Допустимы также обозначения (со всеми регистрами) вида:
cмещение[BX+SI]
[смещение+BX+DI]
[BP][SI]+смещение
5.2 Определения данных.
Для заполнения или резервирования участков памяти в виде байтов, слов или двойных слов служат директивы ассемблера db, dw и dd. Для заполнения или резервирования массивов применяется директива dup:
mem1 db 0F7h;В байт с именем mem1 помещено
;число 0F7h
mem2 dw 0F71Ah;В слово с именем mem2 помещено
;число 0F71Аh
a0 dd myproc;В двойное слово а0 записан полный
;адрес процедуры myproc: сегментный;адрес в старшем слове, смещение в;младшем
mem3 db 256 dup (?);Резервируется участок памяти в
;256 байтов
mem4 dw 512 dup (0);Массив из 512 слов. Заполнен
;нулями
Константы определяются с помощью директивы equ или знака равенства (=):
std equ 100
std1=11*2+3
std3=0aah
Операнды в команде должны иметь одинаковый тип. Для преобразования типа операнда в команде служит оператор ptr:
mem2 dw 0F71Ah
mov AX,mem2;в АХ занесено число 0F71Ah
mov BL,byte ptr mem2;в BL занесено содержимое
;младшего байта - число 01Ah
mov CL,byte ptr mem2+1;в CL занесено содержимое
;старшего байта - число 0F7h
5.2.1 Контрольные вопросы.
1. В памяти последовательно записаны числа:
numbers dw 32765,13,1500,7
Какое число будет иметь имя numbers?
2. В памяти записана следующая информация:
message db 'Привет вам, изучающим ассемблер'
a1 dw message
Что записано в а1? Можно ли для а1 выделить один байт памяти?
3. Обязательны ли пробелы между 256 и dup и между dup и (?) в команде:
mem3 db 256 dup (?)
4. В чем отличие применения директивы equ от знака равенства?
5. Необходимо поместить в ВХ младшую часть адреса процедуры myproc, а в ES - старшую. Допишите команды:
a0 dd myproc
mov BX, ….
mov ES, ….
Дата публикования: 2014-12-10; Прочитано: 361 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!