Пересылки. Арифметические команды
Введем следующие обозначения
|
Местонахождение операнда |
Обозначение |
Запись в ЯА |
|
в команде |
i8, i16, i32 |
константное выражение |
|
в регистре общего назначения |
r8, r16 |
имя регистра |
|
в сегментном регистре |
sr |
CS, DS, SS, ES |
|
в ячейки памяти |
m8, m16, m32 |
адресное выражение |
Цифра в обозначении операнда определяет количество бит, занимаемое этим операндом.
Команды пересылки
MOVop1, op2
По этой команде на место первого операнда пересылается значение второго операнда. Флаги команда не меняет.
В команде MOVдопустимы следующие комбинации операндов:
|
op1 |
op2 |
|
r8 |
i8, r8, m8 |
|
m8 |
i8, r8 |
|
r16 |
i16, r16, sr, m16 |
|
sr (кромеCS) |
r16, m16 |
|
m16 |
i16, r16, sr |
Пример,
MOV AX, 100
MOV DS, AX ;DS := 100
Оператор указания типа (PTR)
<тип> PTR<выражение>, где <тип> - этоBYTE,WORDилиDWORD(имеются и другие варианты).
Данный оператор указывает на то, что значение выражения должно рассматриваться ассемблером как величина указанного типа.
XCHGop1,op2 – перестановка (exchange). Эта команда меняет местами свои операнды. Флаги эта команда не меняет.
Пример
MOV AX, 100 ;AX = 100
MOV BX, 50 ;BX = 50
XCHG AX, BX ;AX = 50, BX = 100
В команде XCHGдопустимы следующие комбинации операндов:
|
op1 |
op2 |
|
r8 |
r8, m8 |
|
m8 |
r8 |
|
r16 |
r16, m16 |
|
m16 |
r16 |
Команды сложения и вычитания
Сложение (Addition): ADD op1, op2
Вычитание (Subtraction): SUB op1, op2
В этих командах допустимы следующие типы операторов:
|
op1 |
op2 |
|
r8 |
i8, r8, m8 |
|
m8 |
i8, r8 |
|
r16 |
i16, r16, m16 |
|
m16 |
i16, r16 |
Примечание. Результат операции ADDиSUBзаносится в первый операнд.
Увеличить на 1 (increment):INC op
Уменьшить на 1 (decrement):DEC op
Изменение знака (negative):NEG op
Сложение с учетом переноса (addwithcarry):ADC op1, op2
Вычитание с учетом заема (subtract with borrow): SBB op1, op2
Команды умножения и деления
Команды умножения
Умножение целых без знака (multiply):MUL op
Умножение целых со знаком (integermultiply):IMUL op
(op:r8,m8, r16, m16)
Второй операнд берется: при умножении байтов из регистра AL, а при умножении слов из регистраAX.
При умножении байтов результат имеет размер слово и записывается в весь регистр AX, а при умножении слов результат имеет размер двойного слова и записывается в два регистра – в регистрDXзаносятся старшие цифры произведения, а регистрAX– младшие цифры.
Команды деления
Деление целых без знака (divide):DIV op
Деление целых со знаком (integerdivide):IDIV op
(op:r8,m8, r16, m16)
Примечание. При делении слова на байт делимое должно находится в регистре AX, а делитель обязан иметь тип байт. При делении двойного слова на слово делимое обязано находится в двух регистрах – вDX(старшая часть делимого) и вAX(младшая часть) и делитель должен быть словом.
Результат:
При делении слова на байт
AH := AX mod op; AL := AX div op.
При делении двойного слова на слово:
DX := (DX, AX) mod op; AX := (DX, AX) div op.
Изменение размера числа
Расширение байта до слова (convertbytetoword):CBW
Операнд всегда берется из AL,а результат записывается вAX.
Расширение слова до двойного слова (convertwordtodoubleword):CWD
Операнд всегда берется из AX,а результат записывается в (DX,AX).
