Система команд i8086 включает 133 базовые команды и позволяет обрабатывать 8- и 16-разрядные данные. Команды могут быть безоперандными, а также содержать один или два операнда. Длина команд может составлять от 1 до 6 байт. Код операции находится в первом байте команды, а остальные байты содержат информацию об адресах операндов. Чтобы различать операции над байтами или словами, в первом байте команды используется специальный разряд W. При W=1 операции выполняются с 16-разрядными данными. В микропроцессоре используются почти все известные способы адресации, что связано с наличием большого набора регистров. При выполнении команд по умолчанию возможны дополнительные варианты адресации, которые задаются с помощью специального однобайтового префикса замены сегмента, записываемого перед командой. Он информирует микропроцессор об использовании для адресации операнда сегментного регистра, отличающегося от регистра, выбираемого по умолчанию. Сегментные регистры ES, CS, SS, DS в 2-разрядном поле reg задаются кодами 00, 01, 10, 11 соответственно.
биты: | | | | 4-3 | | | |
содержимое: | | | | reg | | | |
Вид адресации в команде чаще всего задается байтом, следующим за кодом операции. Байт адресации может определять один или два операнда, его структура представлена ниже. Он содержит поле режима (mod), поле регистра (reg) и поле регистр-память (r/m). Для вычисления исполнительного адреса (ЕА) применяется поле mod или r/m, а также байты смещения (DISP), расположенные в команде непосредственно за байтом адресации.
биты: | 7-6 | 5-3 | 2-0 |
содержимое: | mod | reg | r/m |
При прямой адресации исполнительный адрес находится непосредственно в поле смещения кода команды. В командах безусловных переходов и обращения к подпрограммам прямой адрес формируется из 16-разрядного адреса сегмента (SEG) и 16-разрядного смещения (DISP) (см. ниже). В процессе выполнения команды смещение передается в указатель команд IP, а базовый адрес сегмента - в регистр CS:
биты: | 7-0 | 7-0 | 7-0 | 7-0 | 7-0 |
содержимое: | cop | displ | disph | segl | segh |
| EA |
IP | CS |
В командах обработки данных прямой адрес представляется смещением, следующим за байтом адресации, в формате, изображенном ниже. Разряд d в поле кода операции cop задает направление передачи данных, определяемых полем reg в байте адресации. При d=1 передача операнда производится в регистр задаваемый полем reg в соответствии с кодировкой.
биты: | 7-2 | | | | | 5-3 | | | | 7-0 | 7-0 |
содержимое: | cop | d | w | | | reg | | | | displ | disph |
| EA |
Прямая адресация используется и в командах передачи данных между аккумулятором и памятью:
биты: | 7-1 | | 7-0 | 7-0 |
содержимое: | cop | w | addrl | addrh |
| EA |
В командах с регистровой адресацией операнд находится в одном из регистров общего назначения. Эти команды наиболее компактны и быстро выполнимы т.к. для адресации регистров необходимы 2-3 разряда кода команды, а выполнение этих команд полностью осуществляется внутри микропроцессора. Регистровая адресация может задаваться в байте кода операции:
биты: | 7-3 | 2-0 |
содержимое: | cop | reg |
или с помощью байта адресации:
биты: | 7-2 | | | 7-0 |
содержимое: | cop | d | w | mod reg r/m |
В командах с двумя операндами при mod=1 используются два регистра, и второй регистр указывается кодом в поле r/m:
биты: | 7-2 | | | | | 5-0 |
содержимое: | cop | d | w | | | reg r/m |
Непосредственная адресация позволяет задавать постоянные данные в виде составных частей команды и используется в большинстве команд с двумя операндами. Непосредственный операнд data занимает один или два байта в конце кода команды причем младший байт всегда предшествует старшему. Однобайтовый непосредственный операнд записывается в дополнительном коде и может представлять константы в диапазоне от -128 до +127. Закрашенные участки при изображении байтов указывают на возможность отсутствия их в формате команды, при выполнении определенных условий. Например, 16-разрядный непосредственный операнд используется только при w=1.
биты: | 7-1 | | 7-0 | 7-0 | 7-0 | 7-0 | 7-0 |
содержимое: | cop | w | mod 000 r/m | displ | disph | data | data |
биты: | 7-4 | | 2-0 | 7-0 | 7-0 |
содержимое: | cop | w | reg | data | data |
Представленные два формата команд применяются в командах передачи данных и позволяют загрузить непосредственный операнд по адресу памяти, вычисленному с помощью байта адресации, или в некоторый регистр, определяемый полем reg.
Ниже изображен формат арифметических команд, позволяющих использовать непосредственный операнд длиной в слово при sw=01, или, при s=1, непосредственный операнд в диапазоне от -128 до +127, записываемый в дополнительном коде. В этом формате 3-разрядный код ссс в поле reg служит для идентификации разновидности арифметической операции.
биты: | 7-2 | | | 7-0 | 7-0 | 7-0 | 7-0 | 7-0 |
содержимое: | cop | s | w | mod ccc r/m | displ | disph | data | data |
Формат, представленный ниже, используется в командах арифметических и логических операций, содержащих второй операнд в аккумуляторе AX:
биты: | 7-1 | | 7-0 | 7-0 |
содержимое: | cop | w | data | data |
Непосредственный операнд, представляющий константу, добавляемую к содержимому указателя стека SP, может использоваться в команде возврата из подпрограммы, формат которой представлен ниже:
биты: | 7-0 | 7-0 | 7-0 |
содержимое: | cop | datal | datah |
В командах с регистровой косвенной адресацией 16-разрядный исполнительный адрес EA находится в одном из регистров reg, задаваемых полем r/m байта адресации (см. ниже). В этом способе адресации может использоваться только один из регистров - BX, SI или DI.
биты: | 7-2 | | | | | 5-0 |
содержимое: | cop | d | w | | | reg r/m |
| r/m = BX/SI/DI |