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

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

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

350

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

 

 

 

 

 

Команда

Базовая индексная адресация

 

 

Непосредственная

Данное

 

 

Команда

Регистр

 

 

 

адресация

 

 

 

 

Команда

 

Регистр

 

 

 

 

Регистровая

Регистр

 

Данное

 

 

 

 

адресация

 

 

 

 

 

 

 

 

 

 

 

 

 

Команда

 

Память

 

 

 

 

Прямая

ЕЛ

— > Данное

 

 

 

 

адресация

 

 

 

 

 

 

 

 

 

 

 

Косвенная регистровая адресация

Относительная базовая индексная

адресация

 

Команда

Регистр

 

Память

Команда

 

 

 

Регистр

ЕА

->

Данное

Базовый Индексный

Смещение

 

 

 

 

 

 

регистр

 

 

 

Регистровая относительная

 

 

Регистр

Память

 

Команда

 

адресация

 

Индекс

SEA

 

 

 

 

 

 

 

Регистр

Базовый

адрес

Рис. 4.21. Режимы адресации данных

Если поле mod * 1 1 , один из операндов находится в памяти и ее эффективный адрес ЕА вычисляется согласно табл. 4.9. Значение поля mod = 00 указывает на отсутствие смещения, за исключением значения поля г/т = 110, задающего прямую адресацию. Если значение поля mod = 01, то третий байт команды содержит 8-разрядное смещение disp%, которое до вычисле­ ния эффективного адреса ЕА автоматически расширяется со знаком до 16 разрядов. Значение поля mod = 1 0 означает, что третий и четвертый байты команды содержат 16-разрядное смеще­ ние disp 16. Если же значение поля mod = 11, то операндом является регистр, адрес которого определяется полем г/т. Непосредственный режим адресации в табл. 4.9 отсутствует, так как 8- или 16-разрядный непосредственный операнд является частью команды.

На рис. 4.21 графически изображены определения операндов для всех допустимых режи­ мов адресации данных. Не следует забывать, что физический адрес памяти данных определяет­ ся эффективным адресом ЕА и соответствующим сегмен^ым регистром — D.S, ES или SS. Многочисленные примеры команд, иллюстрирующих все семь методов адресации данных, приведены в листинге, находящемся в самом конце § 4.4 (с. 442 - 444).

В табл. 4.9 указаны также сегментные регистры, используемые по умолчанию при вычис­ лении 20-разрядного физического адреса памяти для различных комбинаций полей mod и г/т. Сегментный регистр стека SS используется по умолчанию при адресации операндов с привле­ чением указателя базы ВР, а в остальных случаях в вычислении физического адреса памяти участвует сегментный регистр данных DS. Для изменения используемых по умолчанию сег­ ментных регистров, в систему команд введена специальная однобайтная команда, называемая префиксом замены сегмента. Формат этой команды представлен на рис. 4.22. Если команде предшествует префикс замены сегмента, то при обращении к данным в процессе ее выполнения участвует сегментный регистр, определяемый полем reg в соответствии с табл. 4.8.

Сегментный регистр DS допускается заменять сегментными регистры CS, SS или ES, а сегментный регистр SS при участии в адресации регистра ВР — на DS, CS или ES. Замену сегментного регистра нельзя производить в следующих специальных случаях:

4.2. Режимы адресации данных и переходов

 

 

 

351

при вычислении адреса очередной выполняемой ко­

D l D 6 D 5 D 4 D 3 0 2 D 1 DO

манды в качестве сегментного регистра всегда использует­

О

0

1

reg

1

1 О

ся сегментный регистр CS;

___I___ I___

__

___I____I___

при участии в адресации указателя стека SP сегмент­

 

 

 

 

 

 

ным регистром может быть только регистр SS',

 

Рис. 4.22. Префикс замены

в цепочечных командах в качестве сегментного реги-

 

 

 

сегмента

 

 

стра операнда-получателя всегда используется регистр ES.

 

 

 

 

 

 

Режимы адресации переходов. Адреса переходов могут являться частью команды или находиться в регистрах и ячейках памяти. Всего имеется четыре режима адресации переходов:

внутрисегментный прямой (near — близкий) — эффективный адрес перехода ЕА равен сумме 8- или 16-разрядного смещения и текущего содержимого указателя инструкции IP. Когда смещение имеет длину 8 бит, этот режим называется коротким переходом (short). Внутрисег­ ментную прямую адресацию называют также относительной адресацией, так как смещение вычисляется “ относительно” указателя инструкции IP. Этот режим допустим в условных и без­ условных переходах, но в команде условного перехода может быть только смещение длиной 8 бит (один байт). Однобайтовые и двухбайтовые смещения воспринимаются как целые числа, представленные в дополнительном коде. Поэтому однобайтовые смещения задают переход в пределах -1 2 8 ...+ 1 2 7 байт относительно адреса следующей команды. При суммировании содержимого указателя инструкции IP с двухбайтовым смещением перенос игнорируется, по­ этому текущий сегмент интерпретируется как кольцо — переход осуществляется по любому адресу текущего сегмента размером 64 Кбайта;

внутрисегментный косвенный (near) — эффективный адрес перехода ЕА есть содержимое регистра или ячейки памяти, которые указываются в любом режиме адресации данных, кроме непосредственного. Содержимое указателя инструкции IP заменяется эффективным адресом перехода ЕА. Данный режим допустим только в командах безусловного перехода;

межсегментный прямой (far — далекий) — заменяет содержимое указателя инструкции IP одной частью команды, а содержимое сегментного регистра кода CS — другой частью ко­ манды. Назначение данного режима адресации — обеспечить переход из одного сегмента кода в другой;

межсегментный косвенный (far) — заменяет содержимое указателя инструкции IP и сег­ ментного регистра кода CS содержимым двух смежных слов из памяти, которые определяются в любом режиме адресации данных, кроме непосредственного и регистрового.

Внутрисегментный прямой

 

Внутрисегментный косвенный

 

Команда

 

 

 

Регистр

 

 

 

 

 

ЕА

IP

 

Команда

ЕА вычисляется

 

перехода

 

 

 

ГР

Режим

в соответствии

или

Память

 

с режимом

 

 

адресации

 

 

 

 

адресации

 

ЕА

IP

 

 

 

 

перехода

 

 

 

 

 

Межсегментный прямой

Межсегментный косвенный

 

Рис. 4.23. Режимы адресации переходов

352

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

Отметим, что физический адрес перехода равен сумме нового содержимого указателя ин­ струкции IP и содержимого сегментного регистра кода CS, умноженного на 1610. Межсегмент­ ный переход может быть только безусловным. Графически определения адресов переходов изо­ бражены на рис. 4.23.

Время выполнения команд. Базовым временем выполнения команды называется время, затрачиваемое на выполнение команды уже находящейся в очереди команд. В противном слу­ чае необходимо учитывать дополнительные такты синхронизации CLK, необходимые для вы­ борки команды — на каждое обращение к памяти при чтении команд затрачивается 4 такта синхронизации. Если операнд находится в памяти, то затрачивается дополнительное время еа на вычисление эффективного адреса ЕА. Это время зависит от режима адресации (см.

табл. 4.9):

прямая — 6 тактов, косвенная регистровая — 5 тактов,

регистровая относительная — 9 тактов,

базовая индексная — 7 тактов при ЕА = BP + DI или ЕА = ВХ + SI, базовая индексная — 8 тактов при ЕА = BP + SI или ЕА = ВХ + DI, относительная базовая индексная — 11 тактов при

ЕА = BP + DI + disp и ЕА = ВХ + SI + disp,

относительная базовая индексная — 12 тактов при

ЕА = BP + SI + disp и ЕА = ВХ + DI + disp.

Например, на выполнение команд сложения ADD, приведенных на рис. 4.19, требуется число тактов синхронизации:

регистр -

регистр...............................................................

 

3,

память -

регистр.................................................................

 

9 + еа,

регистр -

память.................................................................

 

16 + еа,

непосредственный операнд -

регистр...........................

4,

непосредственный операнд -

память.............................

17 + еа,

непосредственный операнд -

аккумулятор..................

4.

Время выполнения команды можно определить умножением числа тактов синхронизации, необходимых для выполнения команды, на период тактового сигнала CLK. Время выполнения команд условных переходов зависит от выполнения или невыполнения условия перехода. Базо­ вые времена выполнения команд приведены при их описании в § 4.3.

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

По назначению команды МП 8086/8088 разделяются на 6 групп (табл. 4.10). Команды на языке ассемблера имеют вид:

СОР; СОР dsv, СОР src\ СОР dst, src,

где СОР — мнемоника кода операции, dst операнд-получатель, src операнд-источник

(dstDestination, src Source). В однобайтных командах операнды в явном виде отсутст­ вуют — указание на используемые операнды заключено в коде операции СОР (неявная адреса­ ция операндов). Например, при выполнении команды XLAT используются операнды, находя­ щиеся в регистрах AL и ИХ. В двухоперандных командах операнды разделяются запятой, и опе­ ранд-получатель указывается слева от запятой.

 

 

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

 

353

 

 

Таблица 4 .10. Группы команд МП 8086/8088

 

 

Команда

Стр.

Команда

Стр.

Команда

Стр.

Команда

Стр.

 

 

1. Команды передачи данных (14 команд)

 

 

IN dst, src

365

LES dst, src

367

POPF

392

XCHG dst, src

365

LAHF

406

MOV dst, src

364

PUSH src

392

XLAT

366

LDS dst, src

367

OUT dst, src

366

PUSHF

392

 

 

LEA dst, src

367

POP dst

392

SAHF

40*

 

 

 

 

2. Арифметические команды (20 команд)

 

 

AAA

368

ADD dst, src

368

DAS

372

INC dst

360

AAD

378

CBW

375

DEC dst

360

MUL src

376

AAM

376

CMP .S7'C|, src2

374

DIV src

378

NEG dst

367

AAS

372

CWD

375

IDIV src

379

SBB dst, src

372

ADC dst, src

368

DAA

368

IMUL src

377

SUB dst, src

372

 

 

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

 

 

 

AND dst, src

380

RCL dst, cnt

383

ROR dst, cnt

383

SHR dst, cnt

381

NOT dst

380

RCR dst, cnt

383

SAR dst, cnt

381

TEST src i, src2

381

OR dst, src

380

ROL dst, cnt

383

SHL/SAL dst, cnt

381

XOR dst, src

380

 

 

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

 

 

CMPS

390

MOVS

388

SCAS

390

 

 

LODS

391

REP

388

STOS

391

 

 

 

 

5. Команды передачи управления (26 команд)

 

 

CALL target

393

JE/JZ sL

404

JNL/JGE sL

404

JS sL

404

INT type

397

JL/JNGE sL

404

JNLE/JG sL

404

LOOP sL

405

INTO

399

JLE/JNG sL

404

JNO sL

404

LOOPNZ/

405

IRET

397

JMP target

403

JNP/JPO sL

404

LOOPNE

 

JB/JNAE/JC sL

404

JNB/JAE/JNC sL

404

JNS sL

404

LOOPZ/

405

JBE/JNA sL

404

JNBE/JA sL

404

JO sL

404

LOOPE 'V

 

JCXZ sL

405

JNE/JNZ sL

404

JP/JPE sL

404

RET

393

 

6. Команды управления процессором (12 команд)

 

CLC

406

CMC

406

LOCK

406

STD

406

CLD

406

ESC

406

NOP

365

STI

406

CLI

406

HLT

406

STС

406

WAIT

406

В табл. 4.10 использованы также обозначения: cnt (counter) — число 1 или регистр CL (число сдвигов), target — адрес, sL (short Label) — короткий переход по метке (переход назад и вперед в интервале адресов -128 ... +127 относительно адреса команды), type — тип прерыва­ ния (type = 0 0 ... FF/г). Полужирным шрифтом выделены команды, которые могут иметь непо­ средственные операнды.

Команды в табл. 4.10 в пределах групп расположены в алфавитном порядке И снабжены указателем страниц, на которых приведено основное их описание. Некоторые команды имеют один или два синонима, для которых алфавитный порядок расположения нарушается (напри­ мер, команды условных переходов JBE/JNA sL и JB/JNAE/JC sL имеют две и три мнемоники, транслируемые ассемблером в одни и те же машинные коды первого байта команды 76/г и 72/г).

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

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

Машинные коды команд. В табл. 4.11 приведены машинные коды (МК) команд, где символом “*” отмечены команды, которые могут выполняться только микропроцессором 80286 и выше, а символом “#” помечены команды, которые могут выполняться только микропроцес­ сорами 80386 или 80486 и выше. Для конкретизации операндов src и dst в табл. 4.11 и 4.12 ис­ пользованы обозначения:

г8 и г16 — 8- и 16-разрядные регистры, seg — сегментный регистр,

г/т — регистр или память, тет% и тет 16 — 8- и 16-разрядные операнды в памяти, im8 и im 16 — 8- и 16-разрядные непосредственные операнды,

imm — г/и8 и г'т16 (непосредственным операндом может быть только операнд-источник), short — короткий переход, near — внутрисегментный (близкий) переход, fa r — межсег­

ментный (далекий) переход.

МК

Ох

Зх

Ах

Вх

Сх

Dx

Ex

Fx

МК

 

Таблица 4.11. Машинные коды МП 8086/8088

 

 

х0

x l

x2

x3

x4

x5

x6

x7

MK

ADD

ADD

ADD

ADD

ADD

ADD

PUSH

POP

Ox

r/m, r8

r/m, r 16

rS, r/m

/-16, r/m

AL, i'm8

AX, /m l6

ES

ES

 

ADC

ADC

ADC

ADC

ADC

ADC

PUSH

POP

lx

r/m, rH

r/m, r 16

/ 8, r/m

r 16, r/m

AL, imS

AX, mi 16

SS

SS

 

AND

AND

AND

AND

AND

AND

segES

DAA

2x

r/m, r8

r/m, r 16

r8, r/m

rl6 , r/m

AL, imS

AX, im l 6

 

 

 

XOR

XOR

XOR

XOR

XOR

XOR

segSS

AAA

3x

r/m, rS

r/m, /-16

rS, r/m

rl6 , r/m

AL, imS

AX, /m l6

 

 

 

INC

INC

INC

INC

INC

INC

INC

INC

4x

AX

CX

DX

BX

SP

BP

SI

DI

 

PUSH

PUSH

PUSH

PUSH

PUSH

PUSH

PUSH

PUSH

5x

AX

CX

DX

BX

SP

BP

SI

DI

 

* PUSHA

* POPA

* BOUND

ARPL

# SEG FS

# SEG GS

# opSize

# addrSize

6x

prefix

prefix

 

 

 

 

 

 

 

JO

JNO

JB/JNAE

JNB/JAE

JE/JZ

JNE/JNZ

JBE/JNA

JNBE/JA

7x

A rO o l

A rO o l

ArO o2

A rO o2

TEST

TEST

XCHG

XCHG

8x

r/m . im&

r/m . im 16

r/m 8. im8

r/m 16. imS

r/m, r8

r/m, rl6

rS, r/m

rl6 , r/m

 

NOP

XCHG

XCHG

XCHG

XCHG

XCHG

XCHG

XCHG

9x

AX, CX

AX, DX

AX, BX

AX, SP

AX, BP

AX, SI

AX, DI

 

 

MOV

MOV

MOV

MOV

MOVSB

MOVSW

CMPSB

CMPSW

Ax

AL, memS

AX, mem 16

m em8, AL

mem 16, AX

 

 

 

 

 

MOV

MOV

MOV

MOV

MOV

MOV

MOV

MOV

Bx

AL, im8

CL, imb

DL, imS

BL, f'w8

AH, im8

CH, imS

DH, im8

BH, imS

 

* ShfOp

* ShfOp

RET near

RET near

LES

LDS

MOV

MOV

Cx

r/mS, im

r/m 16, im

im 16

/■16, mem

r 16, mem

mem, imS

mem, im 16

 

ShfOD

ShfO n

ShfO o

ShfO o

AAM

AAD

 

XLAT

Dx

r/m8.1

r/m 16.1

r/m S. CL

r/m 16. CL

 

 

 

 

 

 

LOOPNE/

LOOPE/

LOOP

JCXZ

IN

IN

OUT

OUT

Ex

LOOPNZ

LOOPZ

#JECXZ

AL, portS

AX, port%

port&, AL

portS, AX

 

LOCK

 

REP/

REPZ/

HALT

CMC

G rp l

G rp l

Fx

 

REPNE

REPE

rim 8

rim 16

 

 

 

 

 

xO

x l

x2

x3

x4

x5

x6

x7

MK

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

355

По табл. 4.11 легко найти машинный код первого байта любой команды. Например, ма­ шинный код команды MOV СН, imS равен В5h. Эта команда выполняет операцию передачи непосредственного операнда гт8, содержащегося во втором байте команды, в регистр СН

(СН <— г'ш8). Префиксы замены сегмента (см. рис. 4.22) выделены в табл. 4.11 строчными бук­ вами seg (segES, segSS, segCS, segDS — машинные коды 26h, 36h, 2Eh, 3E/i).

Восемь машинных кодов D8/i + DFh задают первый байт команд арифметического сопро­ цессора NDCP 8087 (команд ESC), который имеет достаточно разветвленную систему команд за счет дополнительного задания кода операции во втором байте команд (см. § 4.7).

В машинных кодах 80/г -*■83h, DOh * D3/?, F6/i, VIh, FEh и FEh содержится только часть кода операции — дополнительные три разряда КОП (от ООО до 111) содержатся во втором бай­ те (постбайте; табл. 4.12). Эти команды разбиты на шесть групп и выделены в табл. 4.11 полу­ жирным подчеркнутым шрифтом.

м к

Ох

Зх

Ах

Вх

Сх

Dx

Ex

Fx

МК

х8

x9

xA

xB

xC

xD

xE

xF

OR

OR

OR

OR

OR

OR

PUSH

*# Extnsn

r/m, r8

r/m, rl6

r8, r/m

rl6 , r/m

AL, im8

AX, im 16

CS

OpCode

SBB

SBB

SBB

SBB

SBB

SBB

PUSH

POP

rim, r8

r/m, r 16

r8, r/m

r 16, r/m

AL, im8

AX, im 16

DS

DS

SUB

SUB

SUB

SUB

SUB

SUB

segCS

DAS

r/m, r8

r/m, rl6

r8, r/m

rl6 , r/m

AL, im8

AX, im l6

 

 

CMP

CMP

CMP

CMP

CMP

CMP

segDS

AAS

r/m, rH

r/m, r 16

r8, r/m

rl6 , r/m

AL, im8

AX, im 16

 

 

DEC

DEC

DEC

DEC

DEC

DEC

DEC

DEC

AX

CX

DX

BX

SP

BP

SI

DI

POP

POP

POP

POP

POP

POP

POP

POP

AX

CX

DX

BX

SP

BP

SI

DI

* PUSH

* 1MUL

PUSH

* IMUL

* INSB

* INSW

* OUTSB

* OUTSW

im 16

r/m, im 16

imS

r/m, im%

 

 

 

 

JS

JNS

JP/JPE

JNP/JPO

JL/JNGE

JNL/JGE

JLE/JNG

JNLE/JG

MOV

MOV

MOV

MOV

MOV

LEA

MOV

POP

r/m, r8

r/m, rl6

rS, r/m

rl6 , r/m

r/m, seg

rl6 , mem

seg, r/m

r/m

CBW

CWD

CALL fa r

WAIT

PUSHF

POPF

SAHF

LAHF

TEST

TEST

STOSB

STOSW

LODSB

LODSW

SCASB

SCASW

AL, memS

AX, mem 16

 

 

 

 

 

 

MOV

MOV

MOV

MOV

MOV

MOV

MOV

MOV

AX, im 16

CX, im 16

DX, im 16

BX, im 16

SP, im 16

BP, im l6

SI, im 16

DI, im 16

* ENTER

* LEAVE

RET fa r

R E T /ar

INT 3

INT

INTO

IRET

im l6, imS

im l6

im8

 

 

 

 

 

ESCO

ESC 1

ESC 2

ESC 3

ESC 4

ESC 5

ESC 6

ESC 7

CALL near

JM P near

JMP fa r

JMP short

IN

IN

OUT

OUT

AL, DX

AX, DX

DX, AL

DX, AX

 

 

 

 

CLC

STC

CLI

STI

CLD

STD

Grp2

Grp3

r/m 8

r/m l6

 

 

 

 

 

 

x8

x9

xA

xB

xC

xD

xE

xF

M K

Ox

lx

2x

3x

4x

5x

6x

7x

8x

9x

Ax

Bx

Cx

Dx

Ex

Fx

MK

2 3 *

356

 

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

 

 

Таблица 4.12. Команды, определяемые кодом операции постбайта

 

Группа

 

Трехразрядный код операции xxx постбайта mod xxx r/m

 

КОП

000

001

010

011

100

101

110

111

(МК)

A rO pl

ADD

OR

ADC

SBB

AND

SUB

XOR

CMP

(80,81)

r/m, imm

r/m, imm

r/m, imm

r/m, imm

r/m, imm

r/m, imm

r/m, imm

r/m, imm

АгОр2

ADD

 

ADC

SBB

 

SUB

 

CMP

(82, 83)

r/m, imm

 

r/m, imm

r/m, imm

 

r/m, imm

 

r/m, imm

ShfOp

ROL

ROR

RCL

RCR

SHL/SAL

SHR

 

" RAR

(DO + D3)

dst, cnt

dst, cnt

dst, cnt

dst, cnt

dst, cnt

dst, cnt

 

dst, cnt

G rp l

TEST

 

NOT

NEG

MUL

IMUL

DIV

IDIV

(F6, F7)

r/m, imm

 

dst

dst

src

src

src

src

Grp2

INC

DEC

 

 

 

 

 

 

(FE)

r/mS

r/m8

 

 

 

 

 

 

Grp3

INC

DEC

CALL

CALL

JMP

JMP

PUSH

 

(FF)

r/m 16

r/m 16

near

far

near

far

r/m

 

Представление целых чисел без знака и со знаком. МП 8086/8088 могут выполнять арифметические операции сложения, вычитания, умножения и деления над операндами орег, представляющими собой как целые числа без знака, так и целые числа со знаком. Для пред­ ставления величины целого числа без знака используются все разряды операнда орег. Посколь­ ку 28 = 256d и 216 = 65536с?, то диапазон представимых чисел орег без знака равен

0 < oper% < 255d = FFh и 0 < орег 16 < 65535с/ = FFFFh

(орег% — байт, орег 16 — слово).

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

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

0 — число положительное, 1 — число отрицательное,

а значит диапазон представимых абсолютных значений (модулей) чисел будет меньше. Так как число 0 отнесено к положительным числам и одна половина значений операнда орег представ­ ляет положительные числа, а другая — отрицательные, то диапазон представимых чисел со знаком равен

- \2 Ы < oper% < +I21d и -32768с/ < орег 16 < +32767J,

т. е. минимальные и максимальные значения определяются соотношениями:

-2 7 = -128, +(27 - 1) = +127 (для орег%) и - 2 15 = -32768с/, +(215 - 1) = +32767J (т яо р егЩ .

Дополнительный код [орег\д числа орег определяется двумя равносильными соотноше­ ниями:

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

357

[орег]д = орег, если орег > О,

[орег]д = орег, если орег > О,

 

[орег\д = О - | орег |, если орег < О,

[орег]д = | орег | + 1, если орег <

О,

где | орег | — модуль отрицательного числа орег, О - | орег | — двоичное дополнение модуля отрицательного числа (Two's Complement), \ орег | — поразрядно инвертированный модуль отрицательного числа. Дополнительный код положительного числа совпадает с самим числом, поэтому требуется вычислять дополнительный код только отрицательных чисел. Возникающий при вычитании из нуля модуля отрицательного числа орег заем игнорируется, хотя флаг переноса/заема CF устанавливается в 1.

Так как дополнительный код отрицательного числа [орег]а = 0 - ( орег |, то модуль отрица­ тельного числа | орег | = 0 - [орег\д, а значит справедливо и соотношение

| орег | = [орег]д + 1.

Эти соотношения позволяют вычислять модуль отрицательных чисел по их дополнитель­ ному коду двумя способами, идентичным двум способам вычисления дополнительных кодов по модулям отрицательных чисел. Первый способ удобно использовать для контрольных вычис­ лений с помощью калькулятора, имеющегося в графической операционной системе Windows 95/98 персональных компьютеров IBM PC, а второй — для вычислений вручную с помощью карандаша и бумаги.

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

[+0]д

=

0000 0000,

[-0]д =0000 0000,

[+1]д

=

0000 0001,

[ - 1 ] д

= 1 1 1 1 1 1 1 1 ,

[+126]д = 0111

1110,

[—127]д

=

1000 0001,

[+127]д

=

0111

1111,

[—128]д

=

1000 0000.

Сложение чисел в дополнительном коде основывается на теореме [5]:

если при сложении разрядная сетка не переполняется, то дополнительный код арифмети­ ческой суммы [орегх + орег2]д двух двоичных чисел opert и орег2 любых знаков равен арифме­ тической сумме дополнительных кодов этих чисел

[орегх + орег2]д = [орег\\д + [орег2]д — возможный перенос игнорируется;

если числа орег\ > 0, орег2 > 0 и орег\ + орег2 > 2п (п — число разрядов чисел без уче­ та знакового разряда), то происходит переполнение разрядной сетки (флаг OF = 1) с потерей значения +2" и изменением знака остатка суммы на противоположный, что фиксируется во фла­ ге SF;

если орег\ < 0 и орег2 < 0 и | орег[ | + | орег2 \ > 2" + 1, то происходит переполнение раз­ рядной сетки (флаг OF = 1) с потерей значения -2" и изменением знака остатка суммы на про­ тивоположный, что фиксируется во флаге SF.

Пример 1. Десятичные числа орег\ = -98(/ и орег2 = +75с/ (байты) в дополнительном коде имеют представление: [орег\\д = 0 - | operx | = 9Еh и [орег2]д = орег2 = 4В 1г. Сумма десятичных чисел operi + орег2 = -23 d, а дополнительный код суммы определяется арифметическим сложе­ нием дополнительных кодов чисел:

дополнительный код орег\ —> 1 0 0 1 1 1 1 0 = 9Еh — число отрицательное

+

0

1

0

0

0

1

1

=

h

— число положительное

дополнительный код орег2 —¥

1

 

---------------

 

 

 

1--------------

 

 

 

 

Е9h

 

дополнительный код суммы —>

1

1

1

0

1

0

0

1

=

— число отрицательное

358

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

Модуль | орег\ + орег21= 0 - Е9h = 1 1 1 0 1 0 0 1 + 1 = \ lh = 23d.

Пример 2.

Положительные десятичные числа орег^ = + 9Ы и oper2 - + 15d (байты) в допол­

нительном коде имеют представление: [орегх\д = орег\ = 62h и [орег2]д = oper2 = 4Вh. Сумма орегу + орег2 = 173d > 27 = 128с?, т. е. при их сложении произойдет переполнение разрядной сет­ ки. Проверка:

 

0 1

1 0 ^ 0 0 1 0 = 62h — число положительное

Флаги:

+ 0 1 0 0 1 0 1

1 = 4В h — число положительное

OF<— 1,C F « —0

1 0 1 0 1 1 0 1

= ADA — число отрицательное

Пример 3. Отрицательные десятичные числа орег\ = -98 d и oper2 = - 15d в дополнительном коде имеют представление: [орег{]д = 0 - | operx | = 9Еh и [орег2]д = 0 - | орег2 | = В5h. Сумма модулей этих чисел | орег{ \ + | орег2 \ - 173d > 27 + 1 = 129d, т. е. при их сложении произойдет переполнение разрядной сетки. Проверка:

 

1 0

0 1

1

1

 

1 0

= 9Еh

— число отрицательное

Флаги:

I

 

1

1

1

0

1 =

В5h

— число отрицательное

1 0 1

0

OF <— 1, CF <— 1

0 1

0

1

0

0

1

1 = 5 Зй

— число положительное

Логика обнаружения переполнения весьма проста: переполнение разрядной сетки при сложении чисел в дополнительном коде происходит только в том случае, если функция

C s. | © Q = 1,

где Cs — перенос в знаковый разряд, Cs+i — перенос из знакового разряда, фиксируемый во флаге переноса CF [5]. В микропроцессорах 8086/8088 переполнение разрядной сетки при сло­ жении чисел в дополнительном коде фиксируется во флаге переполнения OF. Этот флаг уста­ навливается в 1 также и при выполнении других арифметических и логических команд (см.

табл. 4.13 на с. 384 - 387).

Программист должен корректно использовать флаги, фиксирующие результат выполнения команд, для выполнения условных переходов. Ярким примером служит некорректное исполь­ зование флага знака SF, в котором при выполнении арифметических операций фиксируется значение старшего разряда байта/слова. Команды условных переходов JS и JNS используют этот флаг, однако, при сложении чисел без знака значение флага SF = 1 не означает, что было получено отрицательное число (при выполнении многих команд МП в принципе не может “уз­ нать”, с какими типами чисел он производит операции).

Форматы команд МП 8086/8088. Ниже приведены форматы всех команд МП 8086/8088. Если команда способна адресовать операнд в памяти (в команде есть поле r/m), то она может содержать еще один или два байта смещения (dispS или disp 16).

Для непосредственных операндов будет указываться только один байт данных с общим обозначением data 8/16 (data 8 — один байт при значении индикатора w - 0, data 16 — два байта при значении индикатора w = 1, причем сначала идет младший, а затем старший байт данных).

Максимальная длина команд равна шести байтам. Далее при описании команд будет ис­ пользоваться не более трех байт, но для любой команды с сокращенной длиной очень легко установить ее полный формат, так как исключаются только старший байт у двухбайтового не­ посредственного операнда (если он есть) и один или два байта смещений disp8 и disp 16 у ко­ манд, имеющих поле r/т. Только у двух команд прямой межсегментной передачи управления (команды CALL и JMP) приведены полные пятибайтовые форматы.

Воздействие команд на флаги будет приведено в табл. 4.13 (с. 384 - 387).

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

359

Форматы команд МП 8086/8088 с кратким описанием простых операций:

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

7

 

Байт 1

 

 

0 7

Байт 2

0 1

Байт 3 0

MOV — передать (move)', dst <— src

 

 

 

 

 

 

 

 

 

 

 

 

 

Регистр/память в/из регистра

1

0 0

0

1 0 0

w m od

reg

 

r/m

 

Непосредственный операнд в регистр/память

1 1 0

0

0

1

1

 

w m o d \0 0

0

r/m

data 8/16

Непосредственный операнд в регистр

1 0 1

lw

 

reg

 

d a ta

8/16

 

Память в аккумулятор

1

0

1

0

0

0 0

w

a d d r low

 

a d d r high

Аккумулятор в память

1

0

1

0

0

0

1

 

w

a d d r low

 

a d d r high

Регистр/память в сегментный регистр

1

0

0

0

1

1

1

 

0 mow, 0 reg

r/m

 

Сегментный регистр в регистр/память

1

0

0

0

1 1

0

 

0 mod] 0 reg

r/m

 

PUSH — включить в стек; Регистр/память Регистр Сегментный регистр

POP — извлечь из стека; Регистр/память Регистр Сегментный регистр

SP <— SP - 2 , M(SF) <—src 16

 

 

 

 

1 1 1 1 1

1

1

1 modi 1 1 0

r/m

0

1 0 1 0

 

reg

 

 

0

0 0 \r e g

1

1

0

 

d stl6 <—M(SP), SP <— SP + 2

 

 

 

 

1 0 0 0 1

1

1

1 m o d 0 0 0

r/m

0

1 0 11

 

reg

 

 

О о о г? ^0

1

1

1

 

XCHG — обменять (exchange)', dst src

 

 

 

 

 

 

 

 

 

 

Регистр/память с регистром

1 0 0 0 0

1

1

w m od

reg

r/m

Регистр с аккумулятором

1 0

0

1 0

 

reg

 

 

 

 

IN — ввести из (in p u t fr o m )

 

 

 

 

 

 

 

 

 

 

фиксированного порта

1 1 1 0

0

1 0

w

 

p o rt

 

переменного порта

1 1 1 0

1 1

0 w

 

 

 

OUT — ввести в (o u tp u t to)

 

 

 

 

 

 

 

 

 

 

фиксированный порт

1 1 1 0

0

1

1

w

 

p o rt

 

переменный порт

1 1 1 0

1 1 1

w

 

 

 

XLAT — преобразовать байт из AL (tra n sla te b yte to A L )

 

 

 

 

 

 

 

 

 

 

1 1 0

1 0

1

1

1

 

 

 

LEA — загрузить E A в регистр (lo a d EA to register)

 

 

 

 

 

 

 

 

 

 

 

1 0

0

0

1

1

0

1

m od

reg

r/m

LDS — загрузить полный указатель (4 байта)

 

 

 

 

 

 

 

 

 

 

в регистр и DS (lo a d p o in te r to D S)

1 1 0

0

0

1

0

1 m od

reg

r/m

LES — загрузить полный указатель (4 байта)

 

 

 

 

 

 

 

 

 

 

в регистр и ES (lo a d p o in te r to E S)

1 1 0 0 0 1 0 0

m o d

reg

r/m

LAHF — загрузить младший байт флагов в АН (lo a d А Н w ith fla g s)

 

 

 

 

АН <—low byte PSW (см. рис. 4.2, в)

1 0

0

1 1 1 1 1

 

 

 

SAHF ■— запомнить АН в младшем байте флагов (store А Н into fla g s)

 

 

 

 

Low byte PSW <—АН (см. рис. 4.2, в)

1 0

0

1 1 1 1 0

 

 

 

PUSHF — включить флаги (PSW) в стек

1 0

0 1 1 1 0

0

 

 

 

S P f - S P - 2 , A/(SP) <—PSW

 

 

 

POPF — извлечь флаги (PSW) из стека

 

 

 

 

 

 

 

 

 

 

PSW«-M(SP), SP <—SP + 2

1 0

0 1 1 1 0

1