Модель программирования 8088




Для того, чтобы понять 8088 и научиться программировать для него, мы начнем с его внутреннего устройства. Внутри процессора имеются специальные ячейки памяти, называемые регистрами. В регистрах можно сохранять данные-операнды или адреса памяти.

Набор регистров 8088 состоит из нескольких групп. Все регистры 8088 показаны по группам на Фиг 3.1.

Регистры общего назначения
(16 бит) Старший 8 бит Младший 8 бит
AX AH AL
BX BH BL
CX CH CL
DX DH DL
Адресные регистры
SI
DI
BP
Регистры управления
SP
IP
FLAGS
Сегментные регистры
CS
DS
ES
SS

Фиг. 3.1 Регистры 8088

Поскольку регистры расположены внутри самого процессора, он имеет очень быстрый доступ к находящимся в них данным, намного более быстрый, чем к данным в памяти. Если в программе требуется быстрыый доступк какой-либо переменной, то хранение ее значения в регистре ускоряет выполнение.

Регистры общего назначения

В первую группувходят регистры, используемые в основном для вычислений. Все эти общие регистры имеют размер 16 бит, но программа может работать и со старшими или младшими 8-ю битами каждого регистра отдельно. Например. регистр AX состоит из 16 бит. Программа может обратиться к старшим 8 битам AX как к регистру AH, а младшие 8 бит образуют регистр AL. То же самое верно для регистров BX, CX и DX. Программа может рассмматривать группу регистров как четыре 16-битовых, восемь 8-битовых или некоторую комбинацию 8- и 16-битовых регистров.

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

Регистр AX соответствует сумматору более ранних процессоров. Хотя 8088 значительно более универсален, например, в части арифметических операций, чем ранние машинывроде процессора 8080, регистр AX имеет несколько специальных функций. Фирма Intel оптимизировала набор команд 8088, привлекая к выполнению некоторых операций регистр AX. Например, существуют непосредственные операции, в которых один из операндов подразумеваетсясамой командой. Непосредственные операции с регистрами AX и AL (16- и 8-битовый сумматоры соответственно) обычно требуют более короткой команды, чеманалогичные операции с привлечением других регистров общего назначения. А меньший размер команды позволяет получать более компактные и быстродействующие программы.

Регистр BX служит как регистром для вычислений, так и адресным регистром. При использовании в качестве 16-битового регистра он может служить для определения адреса операнда. Способы адресации для микропроцессора 8088 выделены в следующий пункт.

Набор команд 8088 использует регистр CX в качестве счетчика к некоторым иструкциям. Эти команды используют находящееся в CX значение как указатель числа итераций команды или фрагмента программы.

Регистр DX служит как расширение аккумулятора для многоразрядныхопераций умножения и деления. В этих 32-битовых операциях участвут одновременно регистры AX и DX.

Регистры адресации

В процессоре 8088 имеется четыре 16-битовых регистров, которые могут принимать участие в адресации операндов. Один из них является одновременно регистром общего назначения - регистр базы BX. Другие три - это указатель базы (Base Poiner- BP), индекс источника (Source Index -SI) и индекс назначения (DestinationIndex - DI). Программа может использовать регистры BP, SIи DI в качестве 16-битовых операндов, но отдельные байты в них недоступны. Основное назначение этих регистров - поставлять 16-битовые значения, используемые в формировании адресов операндов.

Microsoft (R) Macro Assembler Version 5.00 11/17/88 21:42:25Фиг 3.2 Адресация операндов Page 1-1PAGE,132TITLE Фиг 3.2 Адресация операндов0000 CODE SEGMENT ASSUME CS:CODE,DS:CODE,SS:CODE0123 ORG 123H0123???? OPND DW?0200 ORG 200H0200 43 INC BX;Увеличение регистра0201 FF 06 0123 R INC OPND;Увеличение ячейки памяти0205 FF 07 INC WORD PTR [BX];Увеличение слова памяти0207 FF 87 0123 R INC [OPND+BX];Смещение плюс индекс020B FF 84 0123 R INC [OPND+SI]020F FF 84 0123 R INC OPND[SI];Другой способ - тот же результат0213 FF 85 0123 R INC OPND + [DI]0217 FF 86 0123 R INC [OPND] + [BP]021B FF 00 INC WORD PTR [BX+SI];База плюс индекс021D FF 03 INC WORD PTR [BP]+[DI]021F FF 81 0123 R INC [OPND+BX+DI];База + индекс + смещение0223 FF 82 0123 R INC OPND[BP][SI]0227 CODE ENDS END

Фиг 3.2 Адресация операндов

Каждая команда в 8088 задает для выполнения некоторую операцию. Разные операции могут иметь от нуля до двух операндов. Например, команде разрешения прерываний Set Interrupt (STI) операнды не нужны. Команда увеличения (INC) требует, чтобы программист определил один операнд, - регистр или ячейку памяти, - который должен быть увеличенна еденицу. Команда ADD (сложение) должна иметь два операнда - складываемые величины. Некоторые команды неявно задают расположение операнда, но большинство команд позволяют программисту выбирать в качестве операнда регистр или ячейку памяти. Если в качестве операнда выбран регистр, топрограммисту остается только указать его имя. Для указания же в качестве операнда участка памяти у вас есть много различных способов. Хорошим примером служит команда INC. Она имеет единственный операнд. На Фиг. 3.2 изображен листинг ассемблерас несколькими различными вариантами команды INC. Первая команда INC называет в качестве операнда регистр BX. Заметим, что в поле операндов в этом случае кроме BX ничего нет. Остальные команды в примере указывают в качестве операнда ячеку памяти. И хотя в них иногда появляется имя регистра BX,он не является здесь самим операндом, а используется для определения его адреса.

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

Простейший способ определить операнд в памяти - дать имя ячейке памяти. В дальнейшем программа использует это имя в командах для ссылки на соответствующийучасток памяти. Вот как этот метод используется в команде

INC OPND.

В примере команда ассемблера

OPND DW?

Объявляет OPND участком памяти длиной в слово. Когда программа ипользует OPND в качестве операнда, ассемблер помещает адрес OPND в машинную команду. В данном примере вы можете видеть адрес 0123 как часть команды в объектном коде. Этот способ называют прямой адресацией, поскольку команда непосредственно в себе содержит адрес операнда

Вычисление адресов

В способе прямой адресации памяти привлекательна простота, но во многих случаях программа вынуждена вычислять действительный адрес в памяти. Простейший пример - операции с вектором, одномерным массивом. В программе на языке Фортран такую структуру можно создать оператором

DIMENTION OPND(20)

В других языках высокого уровня существуют аналогичные способы создания массивов. При выполнении программа получает доступ к разным элементам в соответствии со значением индекса,например, OPND(5). Написание программы на языке ассемблера требует от программиста вычисления местонахождения пятого элемента в поле данных OPND. Затем программа может использовать полученное значение для прямой адресации. Однако, в случае с выражением OPND(I), где I вычисляется входе выполнения программы, способа прямого указания правильного адреса для программы на языке ассемблера не существует. Адрес должен вычисляться в ходе выполнения программы. Набор команд 8088 допускает несколько способов определения исполнительного адреса (Effective Address - EA) операнда. Эти способы вычисления адреса называют способами адресации. Их количество предназначено для облегчения задачи определения исполнительных адресов. Благодаря правильному выбору способа адресации программист может минимизировать количество вычислений в программе. Формула для определения I-го элемента массива OPND такова:

EA = адрес базы OPND + (I * длина),

где длина - это длина каждого элемента массива. В данном примере OPND - массив, состоящий из слов, поэтому каждый элемент в нем имеет длину 2 байта. Тогда формула выглядит так:

EA = адрес базы + (I * 2)

Для вычисления этого адреса требуется по крайней мере один регистр, содержащий адрес операнда. Программа может вычислить исполнительный адрес, оставив результат в одном из регистров. Тогда, вместо указния адреса в самой команде INC, можно просто указать, какой из регистров его содержит. Для хранения адресов операндов программа может использовать любой из четырех адресных регистров. Так, в нашем примере программа добавляет к адресу базы 2*I и помещает результат в регистр BX. Соответствующий элемент вектора в этом случае будет увеличиваться командой

INC WORD PTR [BX]

Выражение [BX] сообщает ассемблеру, что регистр BX содержит адрес операнда,а не является операндом сам по себе. Скобки [ и ], заключающиекакое-либо значение, указывают ассемблеру, что это значение - адрес. Другая часть операндного выражения, WORD PTR, требуется ассемблеру для информации, что операнд является переменной типаWORD (слово). Далее мы обсудим оператор PTR более подробно.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: