Что такое система команд компьютера
методов ввода и вывода.Система команд представляется спецификацией соответствия (микро)команд наборам кодов (микро)операций, выполняемых при вызове команды, определяемых (микро)архитектурой системы. (При этом на системах с различной (микро)архитектурой может быть реализована одна и та же система команд. Например, Intel Pentium и AMD Athlon имеют почти идентичные версии системы команд x86, но имеют радикально различный внутренний дизайн.)
Базовыми командами являются, как правило, следующие:
* арифметические, например, «сложения» и «вычитания»;
битовые, например, «логическое и», «логическое или» и «логическое не»;
* присваивание данных, например, «переместить», «загрузить», «выгрузить»;
* ввода-вывода, для обмена данными с внешними устройствами;
управляющие инструкции, например, безусловный, условный или косвенный переход, вызов подпрограммы, возврат из подпрограммы.Оптимальными в различных ситуациях являются разные способы построения системы команд:
* Если объединить наиболее часто используемую последовательность микроопераций под одной микрокомандой, то надо будет обеспечивать меньше микрокоманд. Такое построение системы команд носит название CISC (Complex Instruction Set Computer), в распоряжении имеется небольшое число составных команд.
* С другой стороны, это объединение уменьшает гибкость системы команд. Вариант с наибольшей гибкостью — наличие множества близких к элементарным операциям команд. Это RISC (Reduced Instruction Set Computer), в распоряжении имеются усечённые, простые команды.
Базовая система команд микропроцессора
Базовую систему команд микропроцессора можно условно разделить на несколько групп по функциональному назначению:
Кроме базовой системы команд микропроцессора существуют также команды расширений:
- 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 ).
Команды преобразования типов
Команды преобразования типов предназначены для корректного изменения размера операнда, заданного неявно в регистре-аккумуляторе ( EAX , AX , AL ). Непосредственно после аббревиатуры команды операнд не указывается.
Команда | Пояснение | Описание |
CBW | AX=(DW)AL | 2 байта ← 1 байт |
CWDE | EAX=(DD)AX | 4 байта ← 2 байта |
CWD | DX:AX=(DD)AX | 4 байта ← 2 байта |
CDQ | EDX:EAX=(DQ)EAX | 8 байт ← 4 байта |
Команды управления флагами
Команды управления флагами предназначены для сброса или установки соответствующего бита регистра признаков EFLAGS . Команды управления флагами не имеют операндов.
Команда | Пояснение | Описание |
CLC | CF = 0 | Сброс бита переноса |
CLD | DF=0 | Сброс бита направления |
CMC | CF=!CF | Инверсия бита переноса |
STC | CF=1 | Установка бита переноса |
STD | DF=1 | Установка бита направления |
STI | IF=1 | Установка бита прерывания |
Команды прерываний
Команды прерываний предназначены для управления программными прерываниями.
Прерывание – это, как правило, асинхронная остановка работы процессора, вызванная началом работы устройства ввода-вывода. Исключением являются синхронные прерывания, возникающие при определении некоторых предопределенных условий в процессе выполнения команды.
Когда поступает сигнал о прерывании, процессор останавливает выполнение текущей программы и переключается на выполнение обработчика прерывания, заранее записанного для каждого прерывания.
Архитектура IA-32 поддерживает 17 векторов аппаратных прерываний и 224 пользовательских.
Команда INT вызывает обработчик указанного операндом прерывания (константой). Операнд определяет номер вектора системного прерывания BIOS от 0 до 255, представленный в виде беззнакового 8-битного целого числа. При вызове обработчика прерывания в стеке сохраняются регистры EIP, CS и EFLAGS.
Прерывание по переполнению вызывается отдельной командой INTO и имеет вектор 04h.
Команда | Пояснение | Описание |
INT с | EIP → стек CS → стек EFLAGS → стек переход к вектору c |
Программное прерывание |
INTO | OF=1 | Прерывание по переполнению |
IRET | EFLAGS ← стек CS ← стек EIP ← стек возврат |
Возврат из обработчика прерывания |
Команды передачи управления
Команда | Операнды | Пояснение | Описание |
JMP | метка r(m)16 r(m)32 |
метка адрес в r(m)16 адрес в r(m)32 |
Безусловный переход на адрес, указанный операндом |
Команды обращения к процедуре (функции)
Команда | Операнды | Пояснение | Описание |
CALL | метка r(m)16 r(m)32 |
метка адрес в r(m)16 адрес в r(m)32 |
Вызов процедуры, указанной операндом |
RET | — c16 |
— Удаляет из стека c16 байт |
Возврат из процедуры |
Команды поддержки языков высокого уровня
Команда | Операнды | Пояснение | Описание |
ENTER | c16, c8 | PUSH EBP MOV EBP, ESP |
Подготовка стека при входе в процедуру. Константа с16 указывает количество байт, резервируемых в стеке для локальных идентификаторов, константа с8 определяет вложенность процедуры |
LEAVE | — | POP EBP | Приведение стека в исходное состояние |
BOUND | r16, m16&16 r32, m32&32 |
m16 m32 | Проверка индекса массива: сравнивает значение в регистре, заданном первым операндом с двумя значениями, расположенными последовательно в ячейке памяти, адресуемой вторым операндом. |
Команды организации циклов — используют регистр ECX по умолчанию в качестве счетчика числа повторений цикла. Каждый раз при выполнении команды LOOPсс значение регистра ECX уменьшается на 1, а затем сравнивается с 0. Если ECX =0 , выполнение цикла заканчивается, и продолжает выполняться код программы, записанный после команды LOOPcc . Если ECX содержит ненулевое значение, то осуществляется переход по адресу операнда команды LOOPcc .
Команды условных переходов — проверяют состояние одного или нескольких битов регистра признаков и при выполнении условия осуществляют передачу программного управления в другую точку кода, задаваемую операндом. Указанный класс команд не запоминает информацию для возврата. Операнд определяет адрес команды, которой должно быть передано управление.
Блок управления и исполнительный тракт
Элементы процессора можно разделить на два основных: блок управления (он же — управляющий автомат) и исполнительный тракт (он же — операционный автомат). Говоря простым языком, процессор — это поезд, в котором машинист (управляющий автомат) управляет различными элементами двигателя (операционного автомата).
Исполнительный тракт подобен двигателю и, как следует из названия, это путь, по которому данные передаются при их обработке. Он получает входные данные, обрабатывает их и отправляет в нужное место после завершения операции. Блок управления, в свою очередь, направляет этот поток данных. В зависимости от инструкции, исполнительный тракт будет направлять сигналы к различным компонентам процессора, включать и выключать различные части пути, а также отслеживать состояние всего процессора.
Блок-схема работы базового процессора. Черными линиями отображен поток данных, а красными — поток команд.
Команды (инструкции)
Команды — это фактические действия, которые компьютер должен выполнять. Они бывают нескольких типов:
- Арифметические: сложение, вычитание, умножение и т. д.
- Логические: И (логическое умножение/конъюнкция), ИЛИ (логическое суммирование/дизъюнкция), отрицание и т. д.
- Информационные: move , input , outptut , load и store .
- Команды перехода: goto , if . goto , call и return .
- Команда останова: halt .
Прим. перев. На самом деле все арифметические операции в АЛУ могут быть созданы на основе всего двух: сложение и сдвиг. Однако чем больше базовых операций поддерживает АЛУ, тем оно быстрее.
Инструкции предоставляются компьютеру на языке ассемблера или генерируются компилятором высокоуровневых языков.
В процессоре инструкции реализуются на аппаратном уровне. За один такт одноядерный процессор может выполнить одну элементарную (базовую) инструкцию.
Группу инструкций принято называть набором команд (англ. instruction set).
Еще несколько нужных команд
При работе с ПК может пригодиться еще несколько команд из огромного списка операторов cmd . Вот некоторые из них:
- format – выполняет форматирование CD диска в дисководе, имя которого указано в параметрах. Синтаксис команды:
format том [/fs: Файловая_Система] [/v: метка] [/q] [/a: размер] [/c] [/x]
При написании синтаксиса какой-либо команды квадратными скобками выделяются необязательные параметры.
Это подтверждает следующий пример написания команды:
format e : — будет отформатирован носитель в дисководе E;
- s et – служит для работы с переменными среды. Эта cmd команда позволяет создавать, удалять и присваивать значение переменным, которые можно использовать во время работы с командной строкой. Синтаксис:
set (/a [выражение) [/p [имя_переменной=) строка]
Пример:
set include=c:inc
- start – предназначена для запуска указанной программы или команды в отдельном окне:
Пример:
start notepad
Теперь с багажом полученных знаний можно не то что своим компьютером управлять, но и целой реальностью. Осталось только запустить соответствующий экземпляр cmd . Да и не все описанные в статье команды могут подойти для управления « действующим экземпляром » нашей реальности.
Команды ввода — вывода (обмена с периферийными устройствами)
Фактически команды ввода-вывода — это тоже команды пересылки. Основное отличие между пересылками «регистр-память» и пересылками из/в периферийное устройство ПУ состоит в том, что скорость функционирования ПУ может существенно отличаться от скорости работы процессора и поэтому ПУ далеко не всегда бывает готово к обмену.
- Устройств ввода-вывода (УВВ) много, надо как-то рбеспечить адресацию.
- Устройства ввода-вывода разные, надо как-то унифицировать правила обмена.
- Скорость работы УВВ отличается от скорости работы процессора, надо как-то синхронизировать работу процессора и УВВ.
Варианты структуры взаимодействия процессора и УВВ:
- а) УВВ имеют свою систему нумерации (адресации), и в системе команд есть отдельные команды I/O, (как в IBM PC):
•IN — команда ввода из ВНУ;
•OUT — команда вывода на ВНУ.
В этом случае в формате команды УВВ предусматривается своя система адресации.
- б) Обращение к УВВ такое же, как к памяти, часть адресов использована для ВНУ (ввод / вывод, отображенный на память).
Достоинства: можно использовать для обмена с ВНУ всю систему команд, в том числе, команды обработки, что сокращает программу.