Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ по Асм №1.doc
Скачиваний:
12
Добавлен:
06.02.2016
Размер:
313.86 Кб
Скачать

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

  1. 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 –если произведению достаточен формат сомножителей.