1. Арифметические операции.
+, -, *, /, mod (эти операции выполняются на этапе трансляции)
pi_int EQU 31416/1000 - целая часть p
pi_rem EQU 31416 mod 1000 - дробная часть p
SHR_N - сдвиговые операции (вправо и влево на N двоичных разрядов.
SHL_R
maska EQU 110010b
maska2 EQU maska SHR_2
2. Логические операции.
Эти операции подразделяются на операции отношения (EQ, NE, LT, LE, GT,GE) и на непосредственно логические (AND, OR, XOR, NOT).
Истина — 0FFFFh
Ложь — 0
mov ax, ((b LT 10) AND 5) OR ((b GE 10) AND 15)
при b=3 предыдущая команда означает: mov ax, 5.
3. Операции со счетчиком размещения программы (СРП).
LC- Location Counter
$- текущее значение СРП, предопределенная переменная.
Message DB ‘Hello!!!’
Mes_leght=$-Message
ORG- директива принудительной установки СРП на константу.
ORG 100h – для *.com
ORG $+99h – изменение СРП на 99 байт по отношению к текущему значению.
EVEN- задает четное значение СРП (выравнивает СРП на ближайшее четное большее текущего).
4. Оператор изменения типа.
<тип> PTR переменная или метка.
B_TABLE DB 40DUP
mov ax, B_TABLE+10
mov ax, word ptr B_TABLE+10
x_word EQU 0FFFCh
xor ax, ax
add al, byte ptr xword; (AL)=FCh
CALL FAR PTR My_Sub
5. Операции выделения сегментной части адреса и смещения.
SEG - переменная (DS)
OFFSET - метка (СS)
SIZE имя переменной - определяет размер переменной в байтах.
Основные группы команд.
1. Команды передачи данных
dst – получатель
src – источник
mem адрес памяти
reg – регистр процессора
sreg – сегментный регистр
data – непосредственные данные
MOV – команда пересылки данных (копирование)
1) одним из операндов должен бать обязательно регистр
2) нельзя пересылать из одной ячейки памяти в другую
3) нельзя содержимое одного сегментного регистра переслать в другой сегментный регистр (нужно использовать РОНы или STACK)
4) нельзя использовать сегментный регистр CS в качестве приемника (потеряются коды)
5) ОПЕРАНДЫДОЛЖНЫСОАПАДАТЬ ПО ДЛИНЕ
Команды ввода/вывода из портов: IN AL,42H
OUT AX,71H
1) LEA AX,mem (аналогично mov AX,OFFSET(mem))
2) Push, Pop
2. Команды арифметической обработки целых чисел.
1) Команды сложения:
а) ADD – сложение mem/reg1, reg2/mem (1_операнд+2_операнд=1_операнд)
dst:=dst+src;
б) INC – увеличение на 1
2) Команды вычитания:
а) DEC – уменьшение на 1
б) SUB dst,src (dst:=dst-src)
в) SBB dst,src – вычитание с переносом
г) NEG – изменяет знак на противоположный
3) Команды сравнения:
а) CMP dst,src
б) SUB dst,src (сравнение осуществляется путем вычитания источника из приемника (воздействует на флаги: CF, OF, SF, ZF, AF, PF)
4) Умножние:
а) MUL src – команда умножения для беззнаковых чисел (выполняет умножение операнда на регистр AX)
б) IMUL src – для знаковых чисел (результат может изменять знаки)
5) Деление:
а) DIV <делитель> (делимое должно находиться в AX!; частное попадает в AL, а остаток в AH)
б) IDIV – деление со знаком (целочисленное)
3. Логические операции (выполняются побитно).
AND, OR, XOR, NOT, TEST dst,src
X | Y | AND | OR | XOR | NOT x |
NOT x не воздействует на флаги! Остальные команды воздействуют на OF, SF, ZF, PF, CF.
4. Сдвиговые операции.
Сдвиговые операции воздействуют на флаги: OF, SF, ZF, PF, CF
1) Простые:
а) SHL/SAL – сдвиг влево
б) SHR/SAH – сдвиг вправо
2) Циклические:
а) ROL/RCL – сдвиг влево
б) ROR/RCR – сдвиг вправо
5. Команды передачи управления.
1) Команды переходов:
1.1) безусловных переходов (JMP):
а) ближний переход
б) дальний переход (по адресу)
1.2) условных переходов (около 30)
1.3) для работы с беззнаковыми числами: JA/JNB/JNC
1.4) для работы со знаковыми числами: JG/JNLE; JS…
1.5) для всех: JE/JZ; JNP/JPO… и др.
Расшифровка команд перехода:
А (Above) – выше (для чисел без знака)
B (Below) – ниже, меньше (без знака)
L (Less) – меньше (для знаковых)
G (Greater) – больше (для знаковых)
N (Not) – не отрицания
E (Equal) – равно
Z (Zero) – 0
2) Команды вызова подпрограмм:
2.1) CALL<имя, адрес…> передает управления с автоматическим
сохранением адреса в STACK.
2.2) RET – всегда возврат в основную программу
(RET2) – возврат из подпрограммы и считывается из STACK 2-а слова.
3) Команды прерываний (INT)
INT<номер прерывания>
INT выполняется следующим образом:
1) Декремент (уменьшение) указателя STACK на 2.
2) Включение в STACK содержимого регистров флага (запомнить).
3) Сброс флагов IF и TF (прерывание разрешаем).
4) Декремент указателя STACK на 2.
5) Сохраняем CS в STACK.
6) Определение адреса вектора прерывания (умножение на 4)
7) Загрузка в CS слова памяти, расположенного по адресу +2
8) Декремент STACK на 2
9) IP сохранить в STACK
10) Загрузка в IP слова памяти, расположенного по адресу (call<адрес>)
IRET – вернуться из прерывания (предназначена для выхода из подпрограммы обработки прерываний).
4) Команды управления флагами.
Push F – запомнить все флаги в стеке
Pop F – достать флаги из стека
FLD – команда пересылки флагов
5) Команды управления процессором.
HLT – приостанавливает работу ПК до RESET
WAIT – синхронизация основного процессора с сопроцессорами
ESC – выход
LOCK – запрещает обращение к шине на время выполнения программ.
6) Команды организации циклов.
LOOP – проверяет завершение цикла
LOOPE/LOOPZ – (если CX=0 или ZF=0)
LOOPNE/LOOPNZ – (если CX=0 или ZF=1)
JCXZ – (если CX=0, то переход к метке).
7) Цепочные команды.
Под цепочкой понимается последовательность любых контекстной связи байт или слов, находящихся в смежных ячейках памяти.
REP, LOOP, либо использовать проверку флагов: DF и DI, SI.
Использование процедур в ассемблере.
Ассемблер относится как к процедурным языкам (Pascal, C, …), так и к непроцедурным. Считается удобным фрагменты текста на ассемблере оформлять в виде процедур, однако оператор CALL far PTR [BX] позволяет обращаться в произвольное место программы, имя процедуры не используется.
Явное описание процедур:
имя_процедуры PROC [тип] [язык] [uses regs]
тело процедуры
ret; retf или retn
имя_процедуры ENDP
тип: far, near (по умолчанию- near);
язык: (по умолчанию- ассемблер);
regs- сохраняются в стеке.
Схема вызова процедуры. При вызове типа NEAR обрабатывание CS не происходит.
My_Proc ENDP
Ret
- - - - - - - - - - - - Стек
My_Proc PROC IP
CS
- - - - - - - - - - - -
Call My_Proc CS IP
Обеспечивается вложенность процедур (ограничена стеком), могут организовываться рекурсивные вызовы. Этапы выполнения процедуры:
- подготовка параметров для работы с процедурой (типы параметров: значения, ссылки, возвращаемые значения, именования (при макровызовах));
- сохранение адреса возврата;
- передача управления на начало процедуры;
- выполнение тела процедуры, включая сохранение регистров, фиксацию результатов, фиксацию кода завершения, восстановление регистров;
- возвращение в основную программу в место после команды вызова, может быть с очисткой стека.