Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Булатов В.Н. Архитектура микропроцессороной системы, состав машинных команд и основы программирования микропроцессорной .pdf
Скачиваний:
97
Добавлен:
02.05.2014
Размер:
7.1 Mб
Скачать

массива на предмет поиска в нем байта F6 (абстрактный пример, весь смысл которого — найти нужный байт).

Составляем программу, используя подходящую для этого случая циклическую команду:

MOV BX, 04FF

;загрузить предначальный адрес массива в BX;

MOV CX, 0100

;загрузить число байтов (циклов) в СX;

M1: INC BX

;подготовить следующий адрес;

CMP BYTE [BX],F6 ;сравнить элемент массива в М<ВХ> с F6, и

LOOPNZ M1

;если элемент обнаружен или CX = 0, то

;выйти из цикла.

Таким образом, цикл будет повторяться до тех пор, пока CX0 и Z0, или более точно по смыслу: цикл будет продолжаться до конца в том случае, если до окончания заданного числа циклов не будет обнаружен байт F6. А иначе досрочное прекращение цикла, при этом в BX окажется адрес элемента массива F6.

10 Цепочные команды

Цепочные (или строчные) команды реализованы в МП 8086 в количестве 5-и штук. Это очень «крутые» команды, хотя любая из этих команд состоит только из одного байта. При изучении данной группы команд важно понять механизм их выполнения, так как по умолчанию они используют до 6-и регистров с четко определенными функциями. Для облегчения изучения этой группы команд сначала «раскрутим» одну только команду, которая представлена в двух видах:

а) команда MOVSB, KOП = A4;

б) команда MOVSW, KOП = А5.

По мнемокоду ассемблера можно догадаться, что это команда пересылки, только с некоторым расширением:

S — цепочная (строчная) команда;

B и W —соответственно байт и слово.

Больше в мнемокодах нет никакой информации. Начнем «раскручивать» эту команду. Основные параметры и этапы выполнения команды:

1) Пересылка: dst := <src> — пересылка из источника в приемник, где

dst = M<ES:DI> , src = M<DS:SI>.

Значит, команда позволяет переслать байт или слово из ячейки памяти одного сегмента в ячейку памяти другого сегмента.

2) После пересылки :

а) DI:= <DI> ± 1, SI:= <SI> ± 1, если переслали

байт;

59

б) DI:= <DI> ± 2, SI:= <SI> ± 2, если переслали слово.

Примечания

а) инкремент («+») происходит в том случае, если флаг DF был сброшен (DF = 0 — нормальное направление) ;

б) декремент («-») происходит в том случае, если флаг DF был установлен (DF = 1 — обратное направление; D — DOWN — вниз).

Установка флага DF производится с помощью специальных команд:

а) установка флага (DF = 1) производится командой STD, КОП

= FD ;

б) сброс флага (DF = 0) производится командой CLD, КОП = FС. Пример – необходимо переслать 5 байт, начиная с адреса 015ЗС,

на место, начиная с адреса 35000.

Выделяем, с учетом команды типа MOVS, по своему усмотрению значения сегментов и адреса в сегментах источника и приемника.

Адрес источника (src): 015ЗС = 0000:15ЗС;

Адрес приемника (dst): 35000 = 3000:5000.

Составляем программу:

CLD

; Сбросить DF (инкремент адресов dst и src);

MOV AX, 0000

; загрузить в

MOV DS, AX

; DS значение сегмента источника;

MOV AX, 3000

; загрузить в

MOV ES, AX

; ES значение сегмента приемника;

MOV SI, 15ЗС

; загрузить адрес источника;

MOV DI, 5000

; загрузить адрес приемника;

MOVSW

; переслать два байта;

MOVSW

; переслать два байта;

MOVSB

; переслать байт.

Команда очень удобная для перемещения массивов в памяти. Но если число цепочки не 5 байтов, и 5000? Очевидно, что нужно организовать цикл. Как это делается, уже рассматривалось в главе 9. Но фирма Intel усилила цепочные команды встроенным циклом, который запускается префиксом повторения. Команда префикса:

а) ассемблер: REP (REPEAT — повторение); б) КОП = F2 или F3 (любой).

Префикс повторения ставится перед цепочной командой и по умолчанию использует счетчик в CX; прекращает повторение при CX = 0. Применим в рассмотренном выше примере префикс повторения:

CLD

 

; Сбросить DF (инкремент адресов dst и src);

MOV AX, 0000

; загрузить в

MOV DS,

AX

; DS значение сегмента источника;

MOV

AX,

3000

; загрузить в

60

MOV ES, AX

; ES значение сегмента приемника;

MOV SI, 15ЗС

; загрузить адрес источника;

MOV DI, 5000

; загрузить адрес приемника;

MOV CX, 005

; счетчик CX:= 510 — число пересылаемых байт;

REP

; повторить пересылку

MOVSB

; пять раз.

Получили классический образец использования цепочной команды.

Теперь можно сделать некоторые выводы, которые необходимо учитывать при использовании цепочных команд:

src в цепочной команде всегда M<DS:SI>;

dst в цепочной команде всегда M<ES:DI>;

длина элемента цепочки равна байту или слову и задается в

ассемблере команды последней буквой соответственно B и W;

повтор выполнения цепочной команды задается префиксом REP, стоящим перед цепочной командой;

число повторов выполнения строчной команды в случае применения префикса REP определяется предварительно заданным числом в регистре СХ;

направление перебора адресов в SI и DI задается флагом направления DF: при DF=0 — инкремент; при DF=1 — декремент.

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

Обобщенный код операции выглядит следующим образом:

Здесь:

W=0 —длина элемента цепочки 1 байт;

W=1 —длина элемента цепочки 2 байта.

В таблице 10 приведены команды в ассемблере с комментариями их действия, привязанные к типу команды. Последние два типа команд

требуют дополнительного пояснения, которые касаются их совместного использования с префиксом повторения. По сути — это арифметические команды, и они воздействуют на флажки. И префикс повторения перед этими командами микропроцессором воспринимается по-разному, в зависимости от кода операции: F2 или F3 (для пересылочных команд это

61