Основные команды программирования процессора

Базовая система команд микропроцессора

Базовую систему команд микропроцессора можно условно разделить на несколько групп по функциональному назначению:

  • команды передачи данных
  • команды установки единичного бита
  • команды работы со стеком
  • команды ввода-вывода
  • арифметические команды
  • логические команды
  • сдвиговые команды
  • команды коррекции двоично-десятичных чисел
  • команды преобразования типов
  • команды управления флагами
  • команды прерываний
  • команды передачи управления
  • команды синхронизации работы процессора
  • команды побитового сканирования
  • строковые команды

Кроме базовой системы команд микропроцессора существуют также команды расширений:

  • X87 – расширение, содержащее команды математического сопроцессора (работа с вещественными числами)
  • MMX – расширение, содержащее команды для кодирования/декодирования потоковых аудио/видео данных;
  • SSE – расширение включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных;
  • SSE2 – модификация SSE, содержит инструкции для потоковой обработки целочисленных данных, что делает это расширение более предпочтительным для целочисленных вычислений, нежели использование набора инструкций MMX, появившегося гораздо раньше;
  • SSE3, SSE4 – содержат дополнительные инструкции расширения SSE.

В таблице команд приняты следующие обозначения:
r – регистр
m – ячейка памяти
c – константа
8, 16, 32 – размер в битах
На все базовые команды процессора накладываются следующие ограничения:

  • Нельзя в одной команде оперировать двумя областями памяти одновременно. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.
  • Нельзя оперировать сегментным регистром и значением непосредственно из памяти. Поэтому для выполнения такой операции нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек.
  • Нельзя оперировать двумя сегментными регистрами. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных регистры общего назначения. Например,
Команды передачи данных

Основной командой передачи данных является команда MOV , осуществляющая операцию присваивания:

Команда MOV присваивает значению операнда приемника значение операнда источника. В качестве приемника могут выступать регистр общего назначения, сегментный регистр или ячейка памяти, в качестве источника могут выступать константа, регистр общего назначения, сегментный регистр или ячейка памяти. Оба операнда должны быть одного размера.
Команды передачи данных представлены в таблице.

Команда Операнды Пояснение Описание
MOV r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8,c8
r(m)16,c16
r(m)32,c32
r(m)8=r8
r(m)16=r16
r(m)32=r32
r8=r(m)8
r16=r(m)16
r32=r(m)32
r(m)8=с8
r(m)16=с16
r(m)32=с32
Пересылка операндов
XCHG r(m)8, r8
r8, r(m)8
r(m)16,r16
r16, r(m)16
r(m)32, r32
r32, r(m)32
r(m)8 ↔r8
r8 ↔r(m)8
r(m)16↔r16
r16 ↔r(m)16
r(m)32↔r32
r32 ↔r(m)32
Обмен операндов
BSWAP r32 TEMP ← r32
r32[7..0]←TEMP[31..24]
r32[15..8]←TEMP[23..16]
r32[23..16]←TEMP[15..8]
r32[31..24]←TEMP[7..0]
Перестановка байтов из порядка «младший – стар­ший» в порядок «старший – млад­ший»
MOVSX r16, r(m)8
r32, r(m)8
r32, r(m)16
r16,r(m)8 DW ← DB
r32,r(m)8 DD ← DB
r32,r(m)16 DD ← DW
Пересылка с рас­ши­ре­ни­ем форма­та и дублирова­ни­ем знакового бита
MOVZX r16,r(m)8
r32,r/m8
r32,r/m16
r16,r(m)8 DW ← DB
r32,r(m)8 DD ← DB
r32,r(m)16 DD ← DW
Пересылка с рас­ши­ре­ни­ем форма­та и дублирова­ни­ем нулевого бита
XLATXLATB m8 AL=DS:[(E)BX+unsigned AL] Загрузить в AL байт из таблицы в сегменте данных, на начало которой указывает EBX (ВХ); начальное зна­чение AL игра­ет роль смещения
LEA r16, m
r32, m
r16=offset m
r32=offset m
Загрузка эффективного адреса
LDS r16,m16
r32,m16
DS:r=offset m Загрузить пару регистров из памя­ти
LSS SS:r=offset m
LES ES:r=offset m
LFS FS:r=offset m
LGS GS:r=offset m
Команды установки единичного бита

Проверяют условие состояния битов регистра EFLAGS и, если условие выполняется, то младший бит операнда устанавливается в 1, в противном случае в 0. Анализ битов производится аналогич­но условным перехо­дам.

Команда Операнды Пояснение
SETA
SETNBE
r(m)8 CF=0 и ZF=0
SETAE
SETNB
SETNC
CF=0
SETB
SETC
SETNAE
CF=1
SETBE
SETNA
CF=1 или ZF=1
SETE
SETZ
ZF=1
SETG
SETNLE
ZF=0 и SF=OF
SETGE
SETNL
SF=OF
SETL
SETNGE
SF!=OF
SETLE
SETNG
SF!=OF или ZF=1
SETNE
SETNZ
ZF=0
SETNO OF=0
SETNP
SETPO
PF=0
SETNS SF=0
SETO OF=1
SETP
SETPE
PF=1
SETS SF=1
Команды работы со стеком
Команда Операнды Пояснение Описание
PUSH r(m)32
r(m)16
c32
ESP=ESP-4; SS:ESP=r(m)32/c
SP=SP-2; SS:SP=r(m)16
Поместить операнд в вершину стека
POP r(m)32
r(m)16
r(m)32=SS:ESP; ESP=ESP+4
r(m)16=SS:SP; SP=SP+2;
Извлечь операнд из вершины стека
PUSHA
PUSHAD
r(m)32
r(m)16
Поместить в стек регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
POPA
POPAD
Извлечь из стека содержимое и заполнить регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
PUSHF Поместить в вершину стека регистр EFLAGS
POPF Извлечь содержимое вершины стека и заполнить регистр EFLAGS
Команды ввода-вывода

Микропроцессор может передавать данные в порты ввода-вывода, которые поддерживаются аппаратно и используют соответствующие своим предназначениям линии ввода-вывода процессора. Аппаратное адресное пространство ввода-вывода процессора не является физическим адресным пространством памяти. Адресное пространство ввода-вывода состоит из 64Кбайт индивидуально адресуемых 8-битных портов ввода-вывода, имеющих адреса 0…FFFFh. Адреса 0F8h…0FFh являются резервными. Любые два последовательных 8-битных порта могут быть объединены в 16-битный порт, 4 последовательных 8-битных порта – в 32-битный порт.

Команда Операнды Пояснение Описание
IN AL,c8
AX,c8
EAX,c8
AL,DX
AX,DX
EAX,DX
AL= port byte
AX= port word
EAX= port dword
AL= [DX-port]
AX= [DX-port]
EAX= [DX-port]
Ввод из порта
OUT c8, AL
c8, AX
c8, EAX
DX, AL
DX, AX
DX, EAX
port byte=AL
port word=AX
port dword=EAX
[DX-port]=AL
[DX-port]=AX
[DX-port]=EAX
Вывод в порт
INSB
INSW
INSD
ES:(E)DI = [DX-port] Вводит данные из порта, адресуемого DX в ячейку памяти ES:[(E)DI]. После ввода 1, 2 или 4-байтного слова данных EDI/DI корректируется на 1,2,4. При наличии префикса REP процесс продолжается, пока EСХ>0
OUTSB
OUTSW
OUTSD
[DX-port]=DS:(E)SI Выводит данные из ячейки памяти, определяемой регистрами DS:[(E)SI], в порт, адрес которого находится в DX. После вывода данных производится коррекция указателя ESI/SI на 1,2 или 4
Команды целочисленной арифметики
Команда Операнды Пояснение Описание
ADD r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8=r(m)8+с8
r(m)16=r(m)16+с16
r(m)32=r(m)32+c32
r(m)8=r(m)8+r8
r(m)16=r(m)16+r16
r(m)32=r(m)32+r32
r8=r8+r(m)8
r16=r16+r(m)16
r32=r32+r(m)32
Сложение целых чисел
ADC Сложение целых чисел с учетом флага переноса CF
INC r(m)8
r(m)16
r(m)32
r/m8=r/m8±1
r(m)16=r(m)16±1
r(m)32=r(m)32±1
Увеличение на 1
DEC Уменьшение на 1
SUB r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8=r(m)8-с8
r(m)16=r(m)16-с16
r(m)32=r(m)32-c32
r(m)8=r(m)8-r8
r(m)16=r(m)16-r16
r(m)32=r(m)32-r32
r8=r8-r(m)8
r16=r16-r(m)16
r32=r32-r(m)32
Вычитание целых чисел
SBB Вычитание с учетом флага переноса CF
CMP r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8-с8
r(m)16-с16
r(m)32-c32
r(m)8-r8
r(m)16-r16
r(m)32-r32
r8-r(m)8
r16-r(m)16
r32-r(m)32
Сравнение целых чисел
По результату сравнения устанавливаются флаги
CF PF
AF ZF
SF OF
NEG r(m)8
r(m)16
r(m)32
r(m)8=-r(m)8
r(m)16=-r(m)16
r(m)32=-r(m)32
Изменение знака числа
MUL r(m)8
r(m)16
r(m)32
AX=AL*r(m)8
DX:AX=AX*r(m)16
EDX:EAX=EAX*r(m)32
Умножение без знака
IMUL r(m)8
r(m)16
r(m)32
r16,r(m)16
r32,r(m)32
r16,r(m)16,c
r32,r(m)32,c
r16,c
r32,c
AX=AL*r(m)8
DX:AX=AX*r(m)16
EDX:EAX=EAX*r(m)32
r16=r16*r(m)16
r32=r32*r(m)32
r16=r(m)16*c16
r32=r(m)32*c32
r16=r16*c16
r32=r32*c32
Умножение со знаком
DIV r(m)8
r(m)16
r(m)32
AL=AX/r(m)8, AH=mod
AX=DX:AX/r(m)16, DX=mod
EAX=EDX:EAX/r(m)32, EDX=mod
Деление без знака
IDIV Деление со знаком

Особого внимания среди рассмотренных команд целочисленной арифметики заслуживает команда CMP , которая вычитает второй операнд из первого и не сохраняет результат, а устанавливает биты OF, SF, ZF, AF, PF, CF регистра признаков EFLAGS в соответствии с результатом. Команда CMP чаще всего предшествует командам знакового или беззнакового условных переходов.

Логические команды

Выполнение логических операций описано здесь

Команда Операнды Пояснение Описание
AND r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8=r(m)8 Ф с8
r(m)16=r(m)16 Ф с16
r(m)32=r(m)32 Ф c32
r(m)8=r(m)8 Ф r8
r(m)16=r(m)16 Ф r16
r(m)32=r(m)32 Ф r32
r8=r8 Ф r(m)8
r16=r16 Ф r(m)16
r32=r32 Ф r(m)32
Логическое умножение (И), конъюнкция
OR Логическое сложение (ИЛИ), дизъюнкция
XOR Исключающее ИЛИ
NOT r(m)8
r(m)16
r(m)32
r(m)8=~r(m)8
r(m)16=~r(m)16
r(m)32=~r(m)32
Логическое отрицание (НЕ), инверсия
TEST r(m)8,с8
r(m)16,с16
r(m)32,с32
r(m)8,r8
r(m)16,r16
r(m)32,r32
r8,r(m)8
r16,r(m)16
r32,r(m)32
r(m)8 & с8
r(m)16 & с16
r(m)32 & с32
r(m)8 & r8
r(m)16 & r16
r(m)32 & r32
r8 & r(m)8
r16 & r(m)16
r32 & r(m)32
Логическое умножение без сохранения результата. В соответствии с результатом устанавливаются флаги
PF ZF SF
Сдвиговые команды

Выполнение сдвиговых операций в языке Си рассмотрено здесь .

Команда Операнды Пояснение Описание
SHR r(m)8
r(m)8,CL
r(m)8,с
r(m)16
r(m)16,CL
r(m)16,c
r(m)32
r(m)32,CL
r(m)32,c
r(m)8 на 1 раздяд
r(m)8 на CL разрядов
r(m)8 на с разрядов
r(m)16 на 1 разряд
r(m)16 на CL разрядов
r(m)16 на c разрядов
r(m)32 на 1 разряд
r(m)32 на CL разрядов
r(m)32 на c разрядов
Логический сдвиг вправо
SAR Арифметический сдвиг вправо (старшие разряды заполняются значением знакового)
SHL
SAL
Логический (арифметический) сдвиг влево
ROR Циклический сдвиг вправо
ROL Циклический сдвиг влево
RСR Циклический сдвиг вправо через перенос
RCL Циклический сдвиг влево через перенос

Команды циклического сдвига

Команды циклического сдвига выполняются в соответствии со схемой

Команды коррекции двично-десятичных чисел

Команды коррекции двоично-десятичных чисел не имеют операндов и используют операнд по умолчанию, хранящийся в регистре AX (паре регистров AH:AL ).

Источник

Читайте также:  Основные принципы логического программирования
Оцените статью