|
Арифметические команды любого
микропроцессора привлекают к себе
наибольшее внимание. Каждый заинтересован
в выполнении
арифметических вычислений, и именно эти
команды проделывают такую
работу. Хотя их немного, они выполняют
большинство преобразований
данных а микропроцессоре. В реальных же
условиях арифметические
команды занимают лишь малую часть всех
исполняемых команд.
Команды пересылки используют большинство
принципов работы
команд микропроцессора 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 изменяла флаги,
выполнить правильно второе сложение было
бы гораздо труднее.
|