Список необходимых команд микропроцессора к1810м86
Команда |
Операнды |
Описание |
Пример |
Регистр флагов |
||||||||||||
ADD |
REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Сложение
Алгоритм: операнд 1=операнд1+операнд2 |
Сложение 5 и -3:
MOV AL, 5 ; AL = 5 ADD AL, -3 ; AL = 2 RET |
|
||||||||||||
AND |
REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Логическое И, результат сохраняется в операнд1
Применяются правила: 1 AND 1 = 1 1 AND 0 = 0 0 AND 1 = 0 0 AND 0 = 0 |
Сложение по И чисел 1100001b и 11011111b:
MOV AL, 'a' ; AL = 01100001b AND AL, ; AL = 01000001b ('A') RET |
|
||||||||||||
DEC |
REG memory |
Декрементация
Алгоритм операнд=операнд-1 |
Уменьшение 255 на1:
MOV AL, 255 ; AL = 0FFh (255 or -1) DEC AL ; AL = 0FEh (254 or -2) RET |
|
||||||||||||
DIV |
REG memory |
Деление (без знака)
Алгоритм: 1)операнд - байт: AL=AX/операнд, AH = остаток 2)операнд – слово: AX=(DX AX)/операнд, DX =остаток |
Деление 203 на 4:
MOV AX, 203 ; AX = 00CBh MOV BL, 4 DIV BL ; AL = 50 (32h), AH = 3 RET |
|
||||||||||||
HLT |
- |
Прекращение выполнения программы |
MOV AX, 5 HLT |
|
||||||||||||
INC |
REG memory |
Инкрементация
Алгоритм: операнд=операнд+1 |
Увеличение 4 на 1:
MOV AL, 4 INC AL ; AL = 5 RET |
|
||||||||||||
JC |
Метка |
Короткий переход, если бит переноса равен 1.
Алгоритм: если CF = 1 то переход
|
Проверка наличия бита переноса:
include 'emu8086.inc' ORG 100h MOV AL, 255 ADD AL, 1 JC label1 PRINT 'no carry.' JMP exit label1: PRINT 'has carry.' exit: RET |
|
||||||||||||
JMP |
Метка 4-хбайтный адрес |
Безусловный переход (перемещение к другой части программы). 4-х байтный адрес может вводиться в виде: 1234h:5678h, первое значение – база сегмента, второе – смещение.
Алгоритм: переход по метке (всегда) |
Выполнить прыжок через 2 строки, напечатать “Got Here!”, если прыжок выполнен:
include 'emu8086.inc' ORG 100h MOV AL, 5 JMP label1 PRINT 'Not Jumped!' MOV AL, 0 label1: PRINT 'Got Here!' RET |
|
||||||||||||
LOOP |
метка |
Декрементация CX, переход к метке, если CX не равен нулю
Алгоритм: CX=CX -1 если CX <> 0 то переход иначе продолжить |
Напечатать “loop” 5 раз:
include 'emu8086.inc' ORG 100h MOV CX, 5 label1: PRINTN 'loop!' LOOP label1 RET |
|
||||||||||||
MOV |
REG, memory memory, REG REG, REG memory, immediate REG, immediate
SREG, memory memory, SREG REG, SREG SREG, REG |
Копирование операнда2 в операнд1
Команда MOV не может: 1.устанавливать значение регистров CS и IP. 2.копировать значение одного сегментного регистра в другой сегментный регистр (необходимо сначала скопировать в регистр общего назначения). 3.копировать непосредственное значение в сегментный регистр
Алгоритм: операнд1=операнд2 |
Занесение числа ABh в регистр AL, пересылка его в ячейку памяти с адресом 01101h:
MOV AL, 0ABh MOV BX, 0100h MOV DS, BX MOV [BX+1], AX RET |
|
||||||||||||
MUL |
REG memory |
Умножение (без знака)
Алгоритм: 1)операнд - байт: AX = AL * операнд 2)операнд - слово: (DX AX) = AX*операнд |
Умножение 200 на 4:
MOV AL, 200 MOV BL, 4 MUL BL ; AX = 0320h (800) RET |
CF=OF=0, если старший бит результата равен нулю |
||||||||||||
NOP |
- |
Нет операции |
Ничего не делать 2 раза:
NOP NOP RET |
|
||||||||||||
NOT |
REG memory |
Инвертирует все биты операнда
Алгоритм: 1.если бит равен 1, то приравнять бит 0 2.если бит равен 0, то приравнять бит 1 |
Инвертировать число 11011b:
MOV AL, 00011011b NOT AL ; AL = 11100100b RET |
|
||||||||||||
OR |
REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Логическое ИЛИ между всеми битами двух операндов. Результат сохраняется в первом операнде.
Применяются правила: 1 OR 1 = 1 1 OR 0 = 1 0 OR 1 = 1 0 OR 0 = 0 |
Сложение по ИЛИ 1000001b и 100000b:
MOV AL, 'A' ; AL = 01000001b OR AL, 00100000b ; AL = 01100001b ('a') RET |
|
||||||||||||
RET |
immediate |
Возврат из процедуры
Алгоритм: 1.вытолкнуть из стека: IP 2.если операнд – константа: SP=SP+operand |
Вызов процедуры занесения числа 1234h в регистр AX, увеличение его на 1
ORG 100h ; for com file CALL p1 ADD AX, 1 RET p1 PROC MOV AX, 1234h RET p1 ENDP |
|
||||||||||||
SAL |
memory, immediate REG, immediate memory, CL REG, CL |
Арифметический сдвиг операнда 1 влево. Число сдвигов устанавливается операндом 2 (константа либо значение регистра CL)
Алгоритм: 1.Сдвиг всех бит влево, старший бит записывается в CF. 2.В качестве младшего бита записывается 0. |
Сдвиг числа E0 влево 1 раз:
MOV AL, 0E0h ; AL = 11100000b MOV CL, 1 SAL AL, CL ; AL = 11000000b, CF=1. RET |
OF=0 если знак операнда1 сохраняется. |
||||||||||||
SAR |
memory, immediate REG, immediate memory, CL REG, CL |
Арифметический сдвиг операнда1 вправо. Число сдвигов устанавливается операндом2 (константа либо значение регистра CL)
Алгоритм: 1.Сдвиг всех бит вправо, младший бит заносится в CF. 2.Старший бит (бит знака) устанавливается в то же значение, что было раньше. |
Сдвиг числа E0 вправо 2 раза (бит знака равен 1):
MOV AL, 0E0h ; AL = 11100000b SAR AL, 2 ; AL = 11111000b, CF=0. RET
Сдвиг числа 4C вправо 1 раз (бит знака равен 0):
MOV BL, 4Ch ; BL = 01001100b SAR BL, 1 ; BL = 00100110b, CF=0 RET |
OF=0 если знак операнда1 сохраняется. |
||||||||||||
SUB |
REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Вычитание
Алгоритм: операнд1=операнд1-операнд2 |
Вычитание 2 из 5:
MOV AL, 5 SUB AL, 2 ; AL = 3 RET
|
|
XOR |
REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Сумма по модулю 2 (исключающее ИЛИ) между всеми битами двух операндов. Результат сохраняется в первом операнде.
Применяются правила: 1 XOR 1 = 0 1 XOR 0 = 1 0 XOR 1 = 1 0 XOR 0 = 0 |
Сумма по модулю два чисел 111b и 10b:
MOV AL, 00000111b XOR AL, 00000010b ; AL = 00000101b RET
|
|
Примечания
REG – регистр общего назначения: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP
SREG – сегментный регистр: DS, ES, SS, только в качестве второго операнда - CS
Memory – ячейка памяти: [BX], [BX+SI+7], var, etc...
Immediate – непосредственный ввод значения.
В описании регистра флагов:
1 – флаг устанавливается в 1
0 – флаг устанавливается в 0
r – значение флага зависит от результата операции
? – значение флага не определено
- - значение флага не изменяется