Добавил:
kostikboritski@gmail.com Выполнение курсовых, РГР технических предметов Механического факультета. Так же чертежи по инженерной графике для МФ, УПП. Писать на почту. Дипломы по кафедре Вагоны Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

литература / Пухальский Проектирование микропроцессорных систем 2001

.pdf
Скачиваний:
333
Добавлен:
12.11.2017
Размер:
21.12 Mб
Скачать

380 Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087

Xi = + 11938с?, Y\ = -1 lid (8-разрядный операнд src) и

Х2 = -2А394399/г, У2 = -26361с? (16-разрядный операнд src).

Вычислить модули частного и остатка. Ответ для проверки:

quot(Xx 1 Y\) = -102c? = -66h,

rem{Xi IY l) = +4;

quot(X2/ Y2) = +26 872c? = +68F8A,

rem(X2/ Y2) = -23 131d = -5А61Й.

Решение:

 

MOV

BH, U ld

NEG

BH

MOV

AX, 11938d

IDIV

BH

MOV

DL, AL

NEG

DL

MOV

BX, 26361c?

NEG

BX

XOR

AX, AX

SUB

AX, 4399h

MOV

DX, 0

SBB

DX, 2A39h

IDIV

BX

MOV

SI, AX

MOV

DI, DX

TEST

SI, 8000/г

JZ

LI

NEG

SI

LI: TEST

DI, 8000/г

JZ

L2

NEG

DI

L2:

 

BH <— 1 lid = 15h — модуль делителя У]

BH <— 0 - BH = 8Bh — дополнительный код делителя У, АХ <— 11938d = 2ЕА2h — дополнительный код делимого X, AL <— [quot]^ = 9Ah, АН <— [гет\Д = 04h

DL <—0 - DL = 66h = 102d — модуль частного quot(X\ / УО

BX 26361c? = 66F9ft — модуль делителя У2

BX <— 0 - BX = 9907/г — дополнительный код делителя У2

АХ <— 0

АХ <— 0 - 4399h = ВС67/г — младшее слово [Х2]д

DX <— 0

DX <— 0 - 2А39h - CF = D5Сб/г — старшее слово [Х2]д

DX:AX = D5C6 ВС67/г = [Х2]д — дополнительный код делимого Х2

АХ <- [quot]a = 68F8h, DX <- [гет]Д = A59Fh, SI 4 - АХ

DI <— DX

SI & 8000/г — проверка знакового разряда частного (команду TEST см. ниже)

SI = | quot | = 68F8A = 26872J

DI & 8000/г — проверка знакового разряда остатка

DI = | гет | = 5А61/г = 23137d

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

3. Логические команды

Команды AND dst, src, OR dst, src, XOR dst, src и NOT dst. Эти команды выполняют над операндами логические двухместные операции И (AND — конъюнкция &), ИЛИ (OR — дизъ­ юнкция v), исключающее ИЛИ (XOR — exclusive OR; сумма по модулю два ®) и одноместную операцию НЕ (NOT complement Boolean — булево дополнение, отрицание, инверсия) соот­ ветственно:

dst <г- dst & src, dst <— dst v src, dst <—dst ® src, dst <— dst,

Все логические операции выполняются поразрядно над байтами и словами. Например,

4.3. Система команд МП 8086/8088

381

А & В = (ак... аха0) &(Ьк ... Ьф0) = (ак &Ьк) ... (ах& bx)(aQ& b0),

А - ак ... a,cz0,

где к = 7 или 15 для 8-разрядных и 16-разрядных операндов dst и src, а, и Ь, — двоичные разря­ ды операндов; а, & Ь, и а, — двоичные (0 или 1) разряды результата.

Выполняются команды AND, OR и XOR за 3 такта (reg —>reg), 9 + еа тактов —> reg),

16 + еа тактов (reg —> М), 17 + еа тактов (imm —> М), 4 такта (imm —> reg', imm —> А). Команда

NOT выполняется за 3 такта (reg), 16 + еа тактов (М). Стрелка

>” указывает операнд-

получатель результата операции.

 

Задача 25. В регистре ВН сбросить в 0 разряды 4 и 1, установить в 1 разряд

5 и проинвер-

тировать разряды 7 и 2. Решение:

 

 

 

 

AND

ВН, OEDft

ВН <— ВН & EDft, EDft = 1110 1101

(b4

& 0 = 0, ft, & 0 = 0)

OR

ВН, 20ft

BH <r- BH v 20ft,

20ft = 0010 0000

(b5 v

1 = 1)

 

XOR

ВН, 84ft

BH <—BH Ф 84ft,

84ft = 1000 0100

(ft, © 1 = Ъъ b2

® 1 = b2)

Команда TEST srcu src2. Эта команда производит над операндами srcj и src2 операцию поразрядной конъюнкции:

src, & src2.

Команда TEST подобна команде AND, но результат jrc ( & src2 не запоминается (операнды srci и src2 не изменяются). Результат выполнения команды TEST отражается только путем мо­ дификации флагов, используемых в командах условных переходов.

Выполняется команда TEST за 3 такта (reg & reg), 9 + еа тактов & reg), 11 + еа тактов

(М & imm), 4 такта (А & imm) и 5 тактов (reg & imm).

Задача 26. Запретить прерывания, если разряд 5 в регистре CL равен 1. Решение:

TEST

CL, 20ft

; CL & 20ft, 20ft = 0010 0000

JZ

CL5_1

 

CLI

 

; Флаг прерываний IF 0

CL5_1:

 

 

Команды сдвигов SHL/SAL dst, cnt, SHR dst, cnt и SAR dst, cnt. Эти команды производят сдвиг разрядов операнда dst влево (команда SHL/SAL; SHL и SAL — синонимы) или вправо (команды SHR и SAR) на один разряд при cnt = 1 или на число разрядов, предварительно за­ данное в регистре CL, т. е. cnt - 1 или cnt = CL.

Операции сдвига разрядов операнда dst наглядно поясняет рис. 4.24 (к - 7 или 15 — для 8-разрядных и 16-разрядных операндов dst соответственно): SHL — логический сдвиг влево, SAL — арифметический сдвиг влево, SHR — логический сдвиг вправо, SAR — арифметиче­ ский сдвиг вправо.

Пример 16:

SHL

DL, 1

; cnt = 1

— сдвиг содержимого регистра DL на один разряд влево

SHR

SI, 1

; cnt = 1

— сдвиг содержимого регистра SI на один разряд вправо

SAL

ВН, CL

; cnt = CL — сдвиг содержимого регистра ВН на CL разрядов влево

SAR

DI, CL

; cnt = CL — сдвиг содержимого регистра DI на CL разрядов вправо

Можно задавать значения CL = 0 ... 255d (0 — сдвиг не производится, 1 — сдвиг на один разряд, как и при cnt = 1). Например, команды SHL DX, 1 и SHL DX, CL производят сдвиг вле­ во содержимого регистра DX на один разряд, если CL = 1. Естественно, что в этом случае предпочтительнее использовать команду SHL DX, 1. В МП 80286/80386 число сдвигов опреде­ ляется пятью младшими разрядами регистра CL, т. е. остатком rem(CL / 32) = 0 ... 31.

382

Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087

SHL/SAL [cF]<— [лГ|<------ -------------------------------- О

Команды арифметических сдвигов (SAL —

SHR

 

 

 

при каждом сдвиге в младший разряд А0 посту­

о —

 

 

пает 0 и SAR — старший разряд Ак при сдвигах

SAR

 

 

 

не изменяется) позволяют производить быстрое

 

 

 

умножение и деление целых чисел без знака и

 

 

|<-|л01<~|

 

ROL

 

 

со знаком на 2т.

 

 

 

 

Все команды сдвигов воздействуют на все

R °R

j-> At -*----- >A2

->

CF

шесть флагов условий (арифметические флаги).

 

 

 

 

Флаг переноса CF участвует во всех операциях

RCL

C F * — Ak <----- A2 <-

<-

 

сдвига операнда dst — от типа команды зависит

 

.H

 

 

лишь место подключения флага CF к операнду.

RCR

Aic ->■----- >A2

A\ -> ^0 —>CF

Этот флаг наиболее важен как результат выпол­

нения команд сдвигов. Флаги нуля ZF, паритета

 

 

 

1

 

 

 

 

PF и знака SF сбрасываются и устанавливаются

 

Рис. 4.24. Команды сдвигов

 

по обычным правилам, а состояние флага AF не

 

 

 

 

определено.

Флаг переполнения OF содержит полезную информацию только в том случае, если число сдвигов cnt = 1. В этом случае состояние флага OF устанавливается в 1, если при сдвиге изме­ няется значение старшего разряда Ак при выполнении команд SHL/SAL и SHR (при выполне­ нии команды SAR значение разряда Акникогда не изменяется — петля на рис. 4.24). Если число сдвигов cnt Ф 1, то значение флага OF не определено.

Выполняются команды сдвига SHL/SAL, SHR и SAR за 2 такта (регистр, cnt = 1), 8 + 4/bit

тактов (регистр, cnt = CL), 15 + еа тактов (память, cnt = 1),

20 + еа + 4/bit тактов

(память,

cnt = CL), где 4/bit означает 4 x CL тактов.

 

 

 

 

Пример 17:

 

 

 

 

 

 

MOV

DL, 63h

DL <-

0 1 1 0 0 0 1 1 = 63/г

 

 

 

SHL

DL, 1

DL <— 1 1 0 0

0 1 1 0 = C6h,

OF = 1, CF = 0

 

SAR

DL, 1

D L < -

1 1 1 0

0 0 1 1 = E3A,

OF = 0, CF = 0

 

SHR

DL, 1

DL <-

0 1 1 1 0 0 0 1 = l\h ,

OF = 1, CF = 1

 

MOV

CL, 2

 

 

 

 

 

 

SHL

DL, CL

DL 4— 1 1 0 0

0 1 0 0 = С4Й,

OF = 1, CF = 1

 

SAR

DL, CL

DL <— 1 1 1 1

0 0 0 1 =F1 h,

OF = 1, CF = 0

 

SAL

DL, CL

DL 4 - 1 1 0 0

0 1 0 0 = C4 ft,

OF = 1, CF = 1

 

MOV

CL, 4

 

 

 

 

 

 

MOV

SI, 54ВЗ/г

SI <- 0101 0100 1011 0011 = 54ВЗЛ

 

 

SAL

SI, CL

SI 4— 0100 1011 0011 0000 = 4В30/г, CF = 1

 

Задача

27. Умножить число без знака X = 107с/

на 2

и разделить число без знака

K=B9E7ft на 25 с потерей остатка гет. Ответ для проверки: Р = 107с/ х 26 =

6848с/ и

quot = B9E57A/25 = 5CFft. Решение:

 

 

 

 

MOV

CL, 6

 

 

 

 

 

 

MOV

DX, 107d

; DX 4— 107c/ = 006Bft

 

 

 

SAL

DX, CL

; DX 4 -

107c/x 26 = 1ACOft

 

 

 

MOV

CL, 5

 

 

 

 

 

 

MOV

DI, 0B9E7ft

;D I 4 - 0B9E7ft = 47591c/

 

 

 

SHR

DI, CL

; DI 4 -

0B9E7ft / 25 = 5CFft 1487с/ = quot

 

4.3. Система команд МП 8086/8088

383

Задача 28. Умножить число со знаком в регистре AL на 2 и разделить число со знаком в регистре SI на 25 с потерей остатка гет (числа представлены в дополнительном коде). Вычис­ лить модули произведения и частного quot. Решение-.

 

 

Численные примеры: [АЬ]Д =

MOV

CL, 6

6 — умножение на 26 = 64

CBW

 

АХ <—AL с расшир. знака

SAL

AX, CL

АХ <— [AL х 2б]д = [/^д

MOV DI, AX

DI <— АХ

TEST

DI, 8000/г

DI & 8000/г — проверка

JZ

L l

знака

NEG

DI

о I! Тз

L1:

 

 

 

 

 

Численные примеры: [SI]fl =

MOV

CL, 5

 

SAR

SI, CL

SI <— [SI / 2' ]д = [quot]j±

MOV

DI, SI

 

TEST DI, 8000/г

DI & 8000/г — проверка

JZ

L2

знака

NEG

DI

DI = j quot|

L2:

 

Потерян остаток:

[+99</]д = 63Л

АХ = 0063/г il 00ио DI = 18С0/г D IIS = 0

Переход на Ll

| Р | = 18С0/г = 6336</ [+31582с/]д = 7В5Е/г

U

SI = 03DAA DI = 03DA/1 DI,5 = 0

Переход на L2

| quot | = 3DA/i = 986d гет = +30d

[-77rf]fl = ВЗЛ

U

АХ = FFB3A

АХ = ЕССО/г DI = ЕССО/г DI,5 = 1

Нет перехода на L1 DI = 1340h

| р | = 1340/г = 4928d

[-18969йГ]д = В5Е7/г

U

SI = FDAFA

DI = FDAF/г D I15 = 1

Нет перехода на L2

п1!

| quot | = 251/г = 593d

гет = +7

Команды циклических сдвигов ROL dst, cnt, ROR dst, cnt, RCL dst, cnt и RCR dst, cnt.

Эти команды производят сдвиг разрядов операнда dst влево (ROL и RCL) или вправо (ROR и RCR) на один разряд при cnt ~ 1 или на число разрядов, предварительно заданное в регистре

CL, т. е. cnt = 1 или cnt = CL.

В МП 80286/80386 число сдвигов определяется пятью младшими разрядами регистра CL,

т. е. остатком rem(CL/32) = 0 ... 31.

Операции сдвига разрядов операнда dst наглядно поясняет рис. 4.24 (к = 7 или 15 — cfo8 и dst16): ROL — циклический сдвиг влево, ROR — циклический сдвиг вправо, RCL — цикличе­ ский сдвиг влево через флаг переноса CF, RCR— циклический сдвиг вправо через флаг перено­

са CF.

Команды циклических сдвигов воздействуют только на флаги переноса CF и переполне­ ния OF. Если число сдвигов cnt ^ 1, то значение флага O F не определено. При задании значе­ ния cnt = 1 значение флага OF устанавливается в 1, если при сдвиге изменяется значение стар­ шего разряда Ак.

Выполняются команды сдвига SHL/SAL, SHR и SAR за 2 такта (регистр, cnt = 1), 8 + Mbit

тактов (регистр, cnt =

CL), 15 +

еа тактов (память, cnt = 1), 20

+ еа + 4/bit тактов (память,

cnt = CL), где 4/bit означает 4 х CL тактов.

 

 

 

 

 

Пример 18:

 

 

 

 

 

 

 

MOV

DL, 63h

DL <—

0 1 1 0 0

0

1 1

= 63/i

 

 

ROL

DL, 1

DL <-

1 1 0 0 0

1 1 0 = C6h,

OF = 1 ,

CF = 0

ROR

DL, 1

DL<—

0 1 1 0 0

0

1 1

= 63/j,

OF = 1, CF = 0

RCR

DL, 1

DL <-

0 0 1 1 0

0

0 1

=31/i,

OF = 0, CF = 1

MOV

CL, 2

 

 

 

 

 

 

 

ROL

DL, CL

; DL < -

1 1 0 0 0

1 0 0

= C4/i,

OF = 0, CF = 0

384

Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087

RCR

DL, CL

; DL <— 0 0 1 1 0 0 0 1 = 31/г,

OF = 0, CF = 0

RCL

DL, CL

; DL <— 1 1 0 0 0 1 0 0 = C4h,

OF = 0, CF = 0

MOV

CL, 4

 

 

 

MOV

SI, 54B3A

; SI <— 0101 0100 1011 0011

= 54ВЗЛ

ROL

SI, CL

; SI <— 0100 1011 0011 0101

= 4В35Й, CF = 1

Задача 29. Разделить число в регистре SI, представленное в дополнительном коде, на 25 без потери остатка гет. Решение'.

 

 

; Численные примеры'. [S% =

XOR

DL, DL

; DL <—0

MOV

CL, 5

; CL <— 5

SAR

SI, 1

; SI <— [SI / 2]д (деление на 2)

RCR

DL, 1

; DL <— CF (сдвиг остатка)

LOOP LI

; SI <— [quot]R

MOV

CL, 3

; CL <— 3

SHR

DL, CL

; DL <— rem

SA R C ^lIf»-

RCR

CF

Рис. 4.25. Схема вычисления частного и остатка

[+31582с?]д = 7В5ЕЛ

u

[quot]a = 03DAh

| quot | = 3DAh = 986d rem = IFh = +30d

[-18969*% = B5E7/i

u

[quot]д = FDAFft

| quot | = 251ft = 592>d rem = +7

Вычисление частного quot и остатка гет выполняется по алгоритму, изображен­ ному на рис. 4.25.

Табл. 4.13 содержит краткое описание команд МП 8086/8088, позволяющее быст­ ро получить справку по операциям, выпол­ няемым командами, и их воздействиям на флаги.

Таблица 4.13. Краткое описание системы команд МП 8086/8088

 

 

 

 

Команды передачи данных

OF DF IF

TF SF ZF AF PF CF

MOV dst, src

dst <—src

 

 

-

-

-

-

-

-

-

-

-

PUSH src

SP <—SP - 2,

A/(SP) <—src

 

 

 

 

 

 

 

 

-

POP dst

dst <—M(SP),

SP <—SP + 2

-

-

 

 

 

 

 

 

 

XCHG dst, src

dst <-» src

 

 

-

 

 

 

 

 

 

IN dst, src

AL <- l/Oiport),

AL <- I/0(DX),

 

 

 

 

 

 

 

 

 

AX <—I/0(port),

AX <- //O(DX)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

OUT dst, src

I/Oiport) <- AL,

l/0(DX) <- AL,

 

 

 

 

 

 

 

 

 

l/Oiport) <- AX,

//O(DX) <- AX.

 

 

 

 

 

 

 

 

 

 

-

 

 

 

-

-

-

 

 

XLAT

AL <- ,WBX + AL)

-

-

-

-

-

LEA dst, src

rl 6 <—addr

 

 

 

 

 

 

 

 

 

 

 

LDS dst, src

r l6 <—M(addr),

DS <—M(addr + 2)

 

 

 

 

 

 

 

 

 

LES dst, src

rl6 <—M(addr),

ES <—M(addr + 2)

 

 

 

 

 

 

 

 

 

LAHF

AH <—low byte PSW

-

 

 

 

 

 

 

-

-

SAHF

Low byte PSW <—AH

-

-

-

r

r

r

r

r

PUSHF

SP <- SP - 2, M (S P )^ P S W

r

r

r

r

r

r

r

r

r

POPF

PSW ^-M (SP),

SP <—SP + 2

4.3. Система команд МП 8086/8088

385

Арифметические команды

ADD dst, src ADC dst, src

INC dst AAA DAA

SUB dst, src SBB dst, src

DEC dst NEG dst

CMP srcx, src2

AAS

DAS MUL src IMUL src

ААМ

DIV src

IDIV src

AAD

CBW

CWD

dst <— dst + src

dst <— dst + src + CF dst <— dst + 1

Л5С//-коррекция для сложения Десятичная коррекция для сложения

dst

dst - src

dst

dst - src - CF

dst <r-dst - 1 dst <— 0 - dst srci - src2

ASCII-коррекцш для вычитания Десятичная коррекция для вычитания

АХ <— AL х src%, D X : AX <— AX x src 16 AX <- AL x srcS, D X : AX AX x src! 6

А£С//-коррекция для умножения________

AL <— quot(AXJsrc&), AH rem(AXJsrc%) AX <- quot(DX:AX/srcl6),

DX n?m(DX: AX/.srci 6)

Д.^.’//-коррекция для деления____________

AH7... AH, AH0 <r-AL7 ... AL7AL7 DX,; ... DX,DX0 <- AX,; ... AX isAX, 5

Логические команды

SHL/SAL dst, cnt

SHR dst, cnt

SAR dst, cnt

ROL dst, cnt

ROR dst, cnt

RCL dst, cnt

RCR dst, cnt

AND dst, src TEST src 1, src2

NOT dst

OR dst, src XOR dst, src

c @ - > —

^ № № № 1

|сЁ |^[а^1<-----

 

Ajj

A 2 -> A j -» A q

D

 

 

A pp -j

j~> Ak

“HAl H Ao|—HCF

 

-< ■

dst <— dst & src — логическое И src1& src2— логическое И

dst <— dst — логическое HE

dst <— dst v src — логическое ИЛИ dst <— dst © src — исключающее ИЛИ

Продолжение таблицы 4.13

OF DF IF TF SF ZF AF PF CF

+

+

+

+

+

X X

OF DF IF TF SF ZF AF PF CF

25 Г. И. Пухальский

386

Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087

 

 

Продолжение табл. 4.13

 

Команды манипуляции цепочками

OF DF IF TF SF ZF AF PF CF

REP/REPZ/REPE

REPNZ/REPNE

MOVS/MOVSB/

MOVSW

CMPS/CMPSB/

CMPSW

SCAS/SCASB/

SCASW

LODS/LODSB/

LODSW

STOS/STOSB/

STOSW

Повторять пока не ноль/не равно (инд. z 1) Повторять пока равно_(индикатор г = 0) Пересылка строки байт/слов

из памяти в память

Сравнение двух строк байт/слов в памяти

Просмотр строки байт/слов: AL/AX - (М)

Загрузка в AL/AX строки байт/слов из памяти

Запись в память строки байт/слов из AL/AX

 

Команды передачи управления

OF DF IF TF SF ZF AF PF CF

CALL target

Вызов процедуры (подпрограммы) - near, far

 

RET

Возврат из процедуры - near,far

 

JMP target

Безусловный переход - short, near,far______

 

JE/JZ sL

Переход, если флаг ZF = 1

 

JNE/JNZ sL

Переход, если флаг ZF = 0

 

JS sL

Переход, если флаг SF = 1

 

JNSsL

Переход, если флаг SF = О

 

JO sL

Переход, если флаг OF = 1

 

JNO sL

Переход, если флаг OF = 0

 

JP/JPE sL

Переход, если флаг PF = 1

 

JNP/JPO sL

Переход, если флаг PF = О

 

JB/JNAE/JC sL

Переход, если флаг CF = 1

 

JNB/JAE/JNC sL ' Переход, если флаг CF = 0

 

JBE/JNA sL *

Переход, если флаги CF v ZF = 1

 

JNBE/JA sL *

Переход, если флаги CF v ZF = 0

 

JL/JNGE sL

Переход, если флаг SF © OF = 1

 

JNL/JGE sL'

Переход, если флаги SF © OF = 0 (SF = OF)

 

JLE/JNG sL '

Переход, если флаги SF © OF v ZF = 1

 

JNLE/JG sL '

Переход, если флаги SF © OF v ZF = 0_____

 

* — при выполнении операций над числами без знака, ** — при выполнении операций над числами со знаком; А — above (выше), В — below (ниже), С — carry (перенос), Е — equally (равно), G — greater (больше),

L — less (меньше), О — overflow — переполнение, Р — parity — паритет (равенство),

РЕ — even parity (четный паритет), РО —• odd parity (нечетный паритет), S — sign (знак), Z — zero (нуль), sL short Label (короткий переход по метке).

LOOP sL

Зациклить CX раз

LOOPZ/LOOPE sL

Зациклить, пока нуль/равно

LOOPNZ/LOOPNE sL Зациклить, пока не нуль/не равно

JCXZ sL

Перейти, если СХ = 0__________

INT type

Прерывание (type = 00 -*■FFh)

INT 3

Прерывание (type =03h)

INTO

Прерывание при переполнении

IRET

Возвратиться из прерывания

 

 

4.3. Система команд М П 8086/8088

 

387

 

 

 

 

Продолжение табл. 4.13

Команды управления процессором

OF DF IF

TF SF ZF AF PF CF

CLC

CF

0

 

 

 

0

СМС

CF <— CF

 

 

 

+

STC

CF

1

 

 

 

1

CLD

DF <— 0

-

0

 

 

STD

DF <— 1

-

1

 

 

CLI

IF 4— 0

-

- 0

- - -

- - -

STI

IF 4 - 1

 

1

 

 

NOP

Пустая операция

 

 

 

 

HLT

Останов МП

 

 

 

 

WAIT

Ожидать значения сигнала TEST = 0

 

 

 

 

ESC

Переключение на сопроцессор

 

 

 

 

LOCK

Блокировка шины

 

 

 

 

П ри м е ч

а н и е: “+” — значение флага определяется результатом операции,

— значение флага не

изменяется, “0” — значение флага сбрасывается в 0, “1” — значение флага устанавливается в 1,

возвращение

значения флага из стека, “х” — неопределенное значение флага.

 

 

 

 

Начиная с этого момента, неподготовленному читателю следует бегло ознакомиться с ма­ териалом, изложенным в § 4.4 (по крайней мере, нужно знать назначение директив определения данных и понимать применение имен переменных в ассемблерных программах).

4.Команды манипуляции цепочками

Впяти однобайтовых командах манипуляции цепочками (табл. 4.13) используется неявная адресация двух операндов, находящихся в памяти или в памяти и аккумуляторе. Для повторе­ ния выполнения этих команд используется префикс повторения REP — число повторений предварительно задается в регистре СХ (например, REP MOVSB — пересылка цепочки длиной

вСХ байт из одной области памяти в другую). При каждом выполнении цепочечной команды автоматически производится декремент содержимого регистра СХ. При получении значения СХ = 0 повторение выполнения команды прекращается.

Операнды могут быть байтами (В) и словами (W). На языке ассемблера для цепочечных команд можно использовать любой из трех форматов:

MOVSB, CMPSB, SCASB, LODSB, STOSB — операндами являются байты; MOVSW, CMPSW, SCASW, LODSW, STOSW — операндами являются слова; MOVS dst, src, CM PS src, dst, SCAS dst, LODS src, STOS dst,

где dst и src — фиктивные операнды, указывающие ассемблеру тип данных, заблаговременно определенный директивами ассемблера (см. § 4.4). Команды с одним операндом dst или src неявно предполагают, что вторым операндом является аккумулятор AL/AX. Операндам dst и src можно присваивать любые имена, определенные директивами ассемблера как байт или сло­ во. Использование фиктивных операндов облегчает также чтение программы, так как с имена­ ми операндов всегда связаны адреса их расположения в памяти. Например, команда REP MOVS string2, string1 указывает, что цепочка байт/слов с начальным адресом string1 пересы­ лается по адресу (начальному) string2, конечно, если эти имена были определены соответст­ вующим образом. Директивами определения данных задается и тип переменных string2 и

25*

388

Глава 4. Микропроцессоры 8086/8088 и сопроцессор 8087

string1 — байты или слова. Команды, содержащие операнды dst и src, ассемблером транслиру­ ются в один из первых двух форматов в зависимости от типа операнда (байт или слово).

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

 

 

 

 

 

Использование

примитивов для

 

Таблица 4.14. Адресация цепочек

 

выполнения

операций

над длинными

Операнд

Адрес

Автоинкремент

Автодекремент

цепочками

позволяет

существенно

уменьшить затрачиваемое на это вре­

(флаг DF = 0)

(флаг DF = 1)

 

 

мя — при выполнении примитива

src8

D S : SI

SI = SI + 1

SI = SI -

1

автоматически производится

адреса­

5Тс16

D S : SI

SI = SI + 2

SI = SI - 2

ция следующего элемента в цепочке.

dst#

E S : SI

DI = DI + 1

DI = DI -

1

В табл. 4.14

приведен

способ адреса­

dst16

E S : SI

DI = DI + 2

DI = DI - 2

ции операндов, реализованный в при­

 

 

 

 

 

 

 

 

 

 

митивах и не зависящий от исполь­

зуемого

формата

команды. Цепочки операндов могут находиться

как в

одном

сегменте

(ES = DS), так и в разных не перекрывающихся сегментах (ES Ф DS). В цепочечных командах для операнда-источника src можно использовать префикс замены сегментного регистра, а в качестве сегментного регистра операнда-получателя dst всегда используется регистр ES.

П рефиксы повторения REP/REPZ/REPE и REPNZ/REPNE. С цепочечными командами MOVS, LODS или STOS, не изменяющими флаги условий, достаточно использовать префикс повторения REP, задающий число повторений, указанное в регистре СХ. В цепочечных коман­ дах CMPS и SCAS, производящих сравнение символов в двух цепочках и сравнение символов одной цепочки с символом в аккумуляторе, для окончания повторений добавочно используется состояние флага ZF. Поэтому имеется два альтернативных префикса повторений:

REP/REPZ/REPE (синонимы; повторять пока ноль/повторять пока равно) — повторение выполнения цепочечных команд пока СХ Ф0 и флаг ZF = 1;

REPNZ/REPNE (синонимы; повторять пока не ноль/повторять пока не равно) — повторе­ ние выполнения цепочечных команд пока СХ ^ 0 и флаг ZF = 0.

Исходное состояние флага ZF не влияет на число повторений — проверка состояния флага ZF производится только после очередного выполнения команды CMPS или SCAS. Проверка значения СХ на нуль проводится перед очередным выполнением любой цепочечной команды, поэтому, если сразу задать значение СХ = 0, то команда не будет выполнена ни разу. В принци­ пе, для префикса повторения можно использовать только две альтернативных мнемоники REP

и REPNZ.

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

Выполняются префиксы повторений за 2 такта.

Команды MOVS dst, src, MOVSB и MOVSW . Эти команды выполняют пересылку цепо­

чек (строк) байт или слов:

 

 

M(ES:DI) <- M(DS:SI), SI <- SI + m, DI <- DI + m, если DF = 0;

 

M(ES:DI) <- M(DS:SI), SI <— SI —m, DI <- DI - m, если DF = 1,

 

где M Memory (память), m = 1 для байт и m = 2 для слов.

-

:

4.3. Система команд МП 8086/8088

389

Выполняются команды за 18 тактов (без повторения) и 9 + 17/гер тактов (с повторением), где П /rep означает 17 х СХ тактов.

Задача 30. Переслать таблицу векторов прерывания персонального компьютера, находя­ щуюся по адресам 0000 : 0000 ... 0000 : 03FFA, в область памяти, определяемую программой пользователя. Решение:

; Пересылка таблицы векторов прерываний для команд INT type

sseg

segment

para STACK

; Сегмент стека

s_seg

db

32 dup (‘St’)

; Стек — 32 слова

ends

 

 

; Конец сегмента стека

d_seg

segment

 

 

; Сегмент данных

buff

db

256 dup(‘B u ff)

; Buffer address = 0000 - 03 FF/г (512 слов)

d_seg

ends

 

 

; Конец сегмента данных

c_seg

segment

 

 

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

main

assume

CS: c_seg, DS: d_seg, SS: s_seg, ES: d_seg

proc

far

Начало процедуры main

 

push

ds

Запись в стек начального адреса PSP (Program Segment Prefics)

 

sub

ax, ax

 

и 0000h (для возврата в DOS)

 

push

ax

 

 

 

mov

ax, d_seg

 

 

 

mov

ds, ax

Инициализация сегментного регистра DS

 

mov

es, ax

ES = DS

; Передача в буфер buff таблицы векторов прерываний команд INT type

 

PUSH

DS

SP <— SP - 2, М(SP) <— DS (сохранение в стеке DS)

 

XOR

AX, AX

АХ 4 - 0000/г

 

MOV

DS, AX

DS

0000/г

 

MOV

SI, AX

SI <—0000/г, DS.SI = 0000:0000k — начальный адрес таблицы

 

LEA

DI, buff

DS

адрес буфера buff, ES.DI — начальный адрес буфера

 

MOV

CX, 200h

 

 

 

CLD

 

DF 0 (автоинкремент)

REP

MOVSW

 

M(ES:buff) <- M(DS:SI), SI = SI + 2, DI = DI + 2

 

POP

DS

DS

M(SP), SP <— SP + 2 (извлечение DS из стека)

main

RET

 

; Конец процедуры main

endp

 

c_seg

ends

main

Конец сегмента кода

 

end

Конец программы

В этой программе использована команда MOVSW, явно указывающая на пересылку слов, поэтому не имеет значения, что буфер buff определен как байтовый. Программа написана с уче­ том требований языка ассемблера — программа транслируется в загрузочный модуль (ехе-файл), что позволяет просмотреть векторы прерываний с помощью отладчика программ (см. § 4.4). Так, для системного прерывания по ошибке деления INT 0 вектор (адрес) вызова подпрограммы обработки прерывания CS : IP = 2F2A : 0258 в PC Pentium II (естественно, на разных компьютерах будут получаться разные вектора, если их операционные системы не сов­ падают). Эта подпрограмма выводит на экран дисплея сообщение: Your program caused a divide overflow error. If the problem persists, contact your program vendor (Ваша программа вызвала ошибку переполнения при делении. Если проблема продолжает существовать, войдите в кон­ такт с вашим продавцом программы).