На главную Назад
Добро пожаловать, уважаемый посетитель!

Арифметические команды любого микропроцессора привлекают к себе

наибольшее внимание. Каждый заинтересован в выполнении

арифметических вычислений, и именно эти команды проделывают такую

работу. Хотя их немного, они выполняют большинство преобразований

данных а микропроцессоре. В реальных же условиях арифметические

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

 

Команды пересылки используют большинство принципов работы

команд микропроцессора 8088, а при изучении арифметических команд

необходимо рассмотреть некоторые тонкости их выполнения.

Команда ADD выполняет сложение указанных операндов, представленных

в двоичном дополнительном коде.Микропроцессор помещает результат

на место первого операнда после того, как сложит оба операнда.

Второй операнд не изменяется.Команда корректирует регистр флагов

в соответствии с результатом сложения.Например, команда

 

ADDAX,BX

 

складывает содержимое регистра BX с содержимым регистра AX, и

оставляет результат в регистре AX.Регистр флагов сообщает о том,

был ли результат нулевым, отрицательным, имел ли четность, перенос

или переполнение.

 

Фиг. 4.8 кратко иллюстрирует варианты команды ADD.

Существуют две формы сложения, 8=битовое и 16=битовое. В различных

формах сложения принимают участие различные регистры. Ассемблер

следит за тем, чтобы операнды соответствовали друг другу.

Содержимое байтового регистра (например, CH) не может быть

прибавлено к ячейке памяти, которая не имеет тип BYTE. Если ячейка

памяти является одним из операндов, она может быть либо

операндом=результатом, либо неизменяемым операндом. Тем самым

команда может прибавить содержимое регистра к ячейке памяти и

возвратить результат в память. Одним из операндов может также быть

непосредственное значение. На Фиг. 4.9 показан листинг ассемблера с

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

 

Команда сложения с переносом ADC - это та же команда ADD, за

исключением того, что в сумму включается флаг переноса. Для любой

формы команды ADD существует сравнимая с ней команда ADC.

ЪДДДДДДДДїЪДДДДДДДДїЪДДДДДДДДї

і AXііAXііAXі

і BXііBXііBXі

і CXііCXіДДДДДДД>іCXі

і DXііDXііDXі

АДДДДДДДДЩАДДДДДДДДЩАДДДДДДДДЩ

ЪДДДДДДДДї+ЪДДДДДДДДїЪДДДДДДДДї

і SIііSIііSIі

і DIііDIііDIі

і BPііBPіДДДДДДД>іBPі

і SPііSPііSPі

АДДДДДДДДЩАДДДДДДДДЩАДДДДДДДДЩ

ЪДДДДДДДДї

і Память і

і(слова) і

АДДДДДДДДЩ

ЪДДДДДДДДДї

іНепосред-і

іственный і

АДДДДДДДДДЩ

 

ЪДДДДДДДДДїЪДДДДДДДДДї ЪДДДДДДДДДї

і AHііAHі іAHі

і ALііALі іALі

і BHііBHі іBHі

і BLііBLі іBLі

і CHііCHі іCHі

і CLі+ іCLі іCLі

і DHііDHі іDHі

і DLііDLі іDLі

АДДДДДДДДДЩАДДДДДДДДДЩ АДДДДДДДДДЩ

ЪДДДДДДДДДї ЪДДДДДДДДДї

і ПамятьіДДДДДДД>і Памятьі

і(слова)і і(слова)і

АДДДДДДДДДЩ АДДДДДДДДДЩ

ЪДДДДДДДДДї

іНепосред-і

іственный і

АДДДДДДДДДЩ

 

Фиг. 4.8 Операции сложения

 

Обе команды сложения, как ADD, так и ADC, устанавливают равным

1 флаг переноса, если произошел перенос из старшего разряда

результата. Команда ADD складывает два операнда, не обращая

внимания на флаг переноса, а команда ADC учитывает и флаг переноса.

Если флаг переноса равен 0, результат равен результату выполнения

команды ADD. Если же флаг переноса равен 1, то результат на 1

больше результата команды ADD. Таким образом, программа может

использовать флаг переноса для операций повышенной точности.

Microsoft (R) Macro Assembler Version 5.001/1/80 04:00:49

Фиг. 4.9Арифметические команды Page1-1

 

 

PAGE,132

TITLEФиг. 4.9Арифметические команды

0000CODESEGMENT

ASSUMECS:CODE,DS:CODE

0000EXBYTELABELBYTE

0000EXWORDLABELWORD

 

000003 1E 0000 RADDBX,EXWORD; BX <- BX + [EXWORD]

000429 0E 0000 RSUBEXWORD,CX; [EXWORD] <- [EXWORD] - CX

000812 3E 0000 RADCBH,EXBYTE; BH <- BH + [EXBYTE] + Carry

000C18 0E 0000 RSBBEXBYTE,CL; [EXBYTE] <- [EXBYTE] - CL - Carry

0010F7 1E 0000 RNEGEXWORD; [EXWORD] <- -[EXWORD]

0014FE 06 0000 RINCEXBYTE; [EXBYTE] <- [EXBYTE] + 1

00184EDECSI ; SI <- SI - 1

 

001981 C7 00C8ADDDI,200; DI <- DI + 200

001D83 EC 64SUBSP,100; SP <- SP - 100

002083 D1 0AADCCX,10; CX <- CX + 10 + Carry

002383 1E 0000 R 14SBBEXWORD,20; [EXWORD] <- [EXWORD] - 20 - Carry

 

00283B C3CMPAX,BX; Установка флагов по AX - BX

002A81 FE 01F4CMPSI,500; Установка флагов по SI - 500

 

002EF6 26 0000 RMULEXBYTE; AX <- AL * [EXBYTE]

0032F7 EBIMULBX ; DX:AX <- AX * BX

0034F7 36 0000 RDIVEXWORD; AX <- DX:AX / [EXWORD]

0038F6 FDIDIVCH ; AL <- AX / CH

 

003A27DAA; Десятичное коррекция для сложения

003B2FDAS; Десятичное коррекция для вычитания

003C37AAA; ASCII коррекция для сложения

003D3FAAS; ASCII коррекция для вычитания

003ED4 0AAAM; ASCII коррекция для умножения

0040D5 0AAAD; ASCII коррекция для деления

004298CBW; AX <- расширенное по знаку AL

004399CWD; DX:AX <- расширенное по знаку AX

 

0044CODEENDS

END

 

Фиг. 4.9 Арифметические команды

Microsoft (R) Macro Assembler Version 5.001/1/80 04:00:54

Фиг. 4.10 Пример вычислений с повышенной точностьюPage1-1

 

 

PAGE,132

TITLEФиг. 4.10 Пример вычислений с повышенной точностью

0000CODESEGMENT

ASSUMECS:CODE,DS:CODE

 

0000????????VALUE1DD? ; Область данных размером 32 разряда

0004????????VALUE2DD?

 

;-----Сложение двух 32-разрядных чисел

 

0008A1 0000 RMOVAX,WORD PTR VALUE1

000B01 06 0004 RADDWORD PTR VALUE2,AX; Сложение младших 16 разрядов

000FA1 0002 RMOVAX,WORD PTR VALUE1+2

001211 06 0006 RADCWORD PTR VALUE2+2,AX; Сложение старших 16 разрядов

;-----Вычитание двух 32-разрядных чисел

 

0016A1 0000 RMOVAX,WORD PTR VALUE1

001929 06 0004 RSUBWORD PTR VALUE2,AX; Вычитание младшей части

001DA1 0002 RMOVAX,WORD PTR VALUE1+2

002019 06 0006 RSBBWORD PTR VALUE2+2,AX; Вычитание старшей части

 

0024CODEENDS

END

 

Фиг. 4.10 Пример с повышенной точностью

 

Фиг. 4.10 иллюстрирует сложение пары 32=битовых чисел; в

примере складываются 32=битовые числа поля VALUE1 и поля VALUE2, а

результат помещается в поле VALUE2. Заметим, что один из операндов

должен быть помещен в регистр. В первом сложении используеся

команда ADD, так как текущее значение флага переноса несущественно

для первого сложения. После соответствующего размещения операндов

программа на Фиг. 4.10 выполняет второе сложение с помощью команды

ADC, с учетом флага переноса, установленного предыдущим сложением.

Это также хороший пример показывающий, почему команда MOV не

устанавливает никаких флагов. Если бы команда MOV изменяла флаги,

выполнить правильно второе сложение было бы гораздо труднее.


 

Mail.ru