Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
46
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 2

г

Основы программирования

73

менте команд организуем цикл занесения в последовательные слова мас­сива ряда нарастающих чисел. Нам придется воспользоваться нескольки­ми новым командами (inc, add и loop), которые в дальнейшем будут рас­смотрены более подробно.

;Сегмент данных array dw ;Сегмент команд

mov SI,0

mov AX,0

mov CX, 10000 fill: mov array[SIJ,AX

inc AX

add SI,2

loop fill

10000

;Начальное значение индекса элемента в массиве ;Первое число-заполнитель ;Число шагов в цикле (всегда в СХ)

;3анесение числа в элемент массива '<•

;Инкремент числа-заполнителя $

;Смещение в массиве к следующему слову ^;

;Возврат на метку fill (CX раз) '•'-

Цикл начинается с команды, помеченной меткой fill (правила обра­зования имен меток такие же, как и для имен полей данных). В этой ко­манде содержимое АХ, поначату равное 0, переносится в ячейку памяти, адрес которой вычисляется, как сумма адреса массива array и содержимо­го индексного регистра SI, в котором в первом шаге цикла тоже 0. В ре­зультате в первое слово массива заносится 0. Далее содержимое регистра АХ увеличивается на 1, содержимое регистра SI — на 2 (из-за того, что массив состоит из слов), и командой loop осуществляется переход на метку fill, после чего тело цикла повторяется при новых значениях регис­тров АХ и SI. Число шагов в цикле, отсчитываемое командой loop, опре­деляется исходным содержимым регистра СХ.

Базо во-индексная адресация. Адресуется память (байт или слово). От­носительный адрес операнда определяется, как сумма содержимого сле­дующих пар регистров:

[BX][SI] (подразумевается DS:[BX][SI]) [BX][DI] (подразумевается DS:[BX][DI]) [BP][SI] (подразумевается SS:[BP][SI]) [BP][DI] (подразумевается SS:[BP][DI])

Это чрезвычайно распространенный способ адресации, особенно, при работе с массивами. В нем используются два регистра, при этом одним из них должен быть базовый (ВХ или ВР), а другим — индексный (SI или DI). Как правило, в одном из регистров находится адрес массива, а в другом — индекс в нем, при этом совершенно безразлично, в каком что. Транс­формируем предыдущий пример, введя в него более эффективную базо-во-индексную адресацию.

;Сегмент данных array dw 10000

;Сегмент команд

mov BX.offset array

mov SI,0

;Базовый адрес массива в

;базовом регистре

;Начальное значение индекса

;элемента в массиве

mov

mov

mov

inc

add

loop

AX,0

CX, 10000

[BX][SI],AX

AX

SI,2

fill

;Первое число-заполнитель

;Чйсло шагов в цикле

fill:

;Отправим число в массив

;Инкремент числа-заполнителя

; Смещение в массиве к следующему слову

;На метку fill (CX раз)

Повышение эффективности достигается за счет того, что команда за­несения числа в элемент массива оказывается короче (так как в неё не входит адрес массива) и выполняется быстрее, так как этот адрес не надо каждый раз считывать из памяти.

Базово-индексная адресация со смещением. Адресуется память (байт или слово). Относительный адрес операнда определяется как сумма со­держимого двух регистров и смещения.

Это способ адресации является развитием предыдущего. В нем исполь­зуются те же пары регистров, но полученный с их помощью результирую­щий адрес можно еще сместить на значение указанной в команде констан­ты. Как и в случае базово-индексной адресации, константа может пред­ставлять собой индекс (и тогда в одном из регистров должен содержаться базовый адрес памяти), но может быть и базовым адресом. В последнем случае регистры могут использоваться для хранения составляющих индекса. Приведем формальный пример рассматриваемого режима адресации.

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

Sims db "QWERTYUIOPO"

db "ЙЦУКЕНГШЩЗХЪ"

Последовательность команд

;Число байтов в строке

mov BX,12

mov SI,6

mov DL,syms[BX][SI]

загрузит в регистр DL элемент с индексом 6 из второго ряда, т.е. код ASCII буквы Г. Тот же результат можно получить, загрузив в один из регистров не индекс, а адрес массива:

mov BX,offset sym

mov SI, 6

mov DL,12[BX][SI]

74