- •Министерство образования и науки
- •Теоретические сведения
- •1.1. Регистры
- •1.1.2. Регистры общего назначения
- •1.1.3. Сегментные регистры
- •1.2. Регистр флагов
- •1.3. Представление данных
- •1.3.1. Целые числа без знака
- •1.3.2. Целые числа со знаком
- •1.3.3. Представление символьных переменных
- •1.4. Лексемы
- •1.4.1. Идентификаторы
- •1.4.2. Целые числа
- •1.4.3. Символьные данные
- •1.5. Предложения
- •1.5.1. Комментарии
- •1.5.2. Команды
- •1.5.3. Директивы
- •1.6. Директивы определения данных
- •1.6.1. Директива db
- •1.6.2. Директива dw
- •1.6.3. Директива dd
- •1.6.4. Директивы эквивалентности и присваивания
- •1.7. Выражения
- •1.8. Обозначения
- •1.9. Команды пересылки
- •1.9.1. Команда mov
- •1.9.2. Команда xchg (exchange)
- •1.10. Команды сложения и вычитания
- •1.10.1. Особенности сложения и вычитания целых чисел в пк
- •1.10.2. Команды сложения и вычитания
- •Например: Mov ah, 1
- •1.11. Команды умножения и деления
- •1.11.1. Команды умножения
- •1.11.2. Команды деления
- •1.12. Изменение размеров числа
- •Задание
- •Контрольные вопросы
- •Литература
1.10.2. Команды сложения и вычитания
Синтаксис:
Сложение: ADD <op1>, <op2>
Вычитание(Subtract): SUB <op1>, <op2>
В этих командах допустимы след. комбинации операндов:
-
Ор1
Op2
r8
m8
r16
m16
i8, r8, m8
i8, r8
i16, r16, m16
i16, r16
Команда ADD складывает операнды и записывает их сумму на место первого операнда: ор1:=ор1-ор2.
Например: ADD AH,12 ;AH:=AH+12
SUB SI, Z ; SI:=SI-Z
ADD Z, -300 ; Z:=Z+(-300)
Числа могут быть как знаковыми, так и беззнаковыми. В этих командах меняются флаги переноса CF, переполнения OF, знака SF и нуля ZF.
Следующие команды увеличивают и уменьшают соответственную единицу: Inc <op>
Dec <op>
В этих командах допустимы следующие виды операндов: r8,m8,r16,m16.
Следующая команда рассматривает свой операнд как число со знаком и меняет его знак на противоположный: ор:= -ор.
Neg <op>
Например: Mov ah, 1
Neg ah; ah=-1
Здесь есть исключения: если ор=-128, то операнд не меняется, т.к. нет знакового числа +128. Аналогично для чисел-слов: если значения операнда равно –32768, то команда не меняет операнд. В этом особом случае флаг OF получает значение 1.
Ещё 2-е команды:
Сложение с учетом переноса: ADC <op1>, <op2>
Вычитание с учетом переноса: SBB <op1>, <op2>
Допустимые типы операндов - как в командах ADD и SUB.
Эти команды аналогично командам ADD и SUB за одним исключением – в команде ADC к сумме операндов ещё прибавляется значение флага переноса CF:op1:=op1+op2+CF, а в команде SBB из разности операндов ещё вычитается значения этого флага ор1:=ор1-ор2-CF.
Эти команды могут пригодится для работы с числами, размером Dword и более. Например, сложить два числа размером Dword : X=1204f003h и Y=8052300fh. Условно разбиваем каждое число на два слова. Сначала складываем младшие (правые) части их, используя команду ADD. При этом может получиться единица переноса , которая попадает в флаг CF. Поэтому старшие (левые) части следует складывать командой ADC, которая и учитывает эту единицу.
X=1204 F003
+ +
Y=8052 300F
9256 12012
+
1 CF
2012
Замечание: При сложении старших разрядов также может получиться единица переноса.
Аналогичным образом реализуется вычитание беззнаковых чисел размером в двойное слово.
Например: Ax, Bx-X,Cx, Dx-Y. Тогда:
(Ax,Bx):=(Ax,Bx)+(Cx,Dx)
ADC Bx,Dx; Bx=Yмл +Yмл, CF-перенос
ADC Ax,Cx ; Ax:=Xст +Yст + CF
(Ax,Bx):=(Ax,Bx)-(Cx,Dx)
Sub Bx,Dx : Bx:=Xмл-Yмл, CF – заем еденицы
SBB Ax,Cx :Ax:=Xст-Yст-CF
1.11. Команды умножения и деления
1.11.1. Команды умножения
Если сложение и вычитания беззнаковых чисел происходит по одним и тем же алгоритмам, (т.е. применяются одни и те же команды), то умножение чисел этих двух классов выполняется по разным алгоритмам.
Синтаксис:
Умножение целых без знака:Mul <op>
Умножение целых со знаком:IMul <op>
В остальном эти команды действуют одинаково:
Умножение байтов:AX:=Al*<op> (op:r8,m8)
Умножение слов:(Dx,Ax):=Ax*<op> (op:r16,m16)
(В регистре Dx-старшая часть, в Ax- младшая)
Пример: N db 10
Mov Al,26
Mul N ; Ax:=26*10=260=0104h
Mov Ax,8
Mov Bx,-1
IMul Bx;(Dx,Ax)= -8= 0FFFF FFF8 h
Dx Ax
Как видно, результат умножения занимает двойной формат. Однако при умножении маленьких чисел нет смысла переходить в программе на двойной формат. Если же мы заранее не знаем , какие числа будут перемножаются , то есть после умножения возможно ли остаться работать в том же формате или следует переходить на удвоенный формат. Это может оценить по флагам CF и OF:
CF=OF=1 – если произведение занимает двойной формат
CF=OF=O –если произведению достаточен формат сомножителей.