Программная модель 32-разрядных процессоров
История 32-разрядных процессоров Intel началась с процессора Intel386 [1,31-34]. Он вобрал в себя все черты своих 16-разрядных предшественников 8086/88 и 80286 для обеспечения совместимости с громадным объемом программного обеспечения (ПО), существовавшего на момент его появления. Однако в процессорах 80386 преодолено жесткое ограничение на длину непрерывного сегмента памяти - 64 Кбайт
В защищенном режиме 32-разрядных процессоров оно отодвинулось до 4 Гбайт - предела физически адресуемой памяти, что тогда можно было считать почти «бесконечностью». Эти процессоры имеют поддержку виртуальной памяти объемом до 64 Тбайт [1,31-34], встроенный блок управления памятью поддерживает механизмы сегментации и страничной трансляции адресов (paging). Процессоры обеспечивают четырехуровневую систему защиты пространств памяти и ввода-вывода, а также переключение задач. Система команд расширена при сохранении всех команд 8086, 80286. Процессор может работать в одном из двух режимов и переключаться между ними достаточно быстро как в ту, так и в другую сторону [1,31-34].
Real Address Mode - режим реальной адресации (или просто реальный режим - Real Mode), полностью совместим с 8086. В этом режиме возможна адресация до 1 Мбайт физической памяти (на самом деле, как и у 80286, почти на 64 Кбайт больше).
Protected Virtual Address Mode - защищенный режим виртуальной адресации (или просто защищенный режим - Protected Mode). В этом режиме процессор позволяет адресовать до 4 Гбайт физической памяти, через которые при использовании механизма страничной адресации могут отображаться до 64 Тбайт виртуальной памяти каждой задачи.
Существенным дополнением является Virtual 8086 Mode - режим виртуального процессора 8086. Этот режим является особым состоянием задачи защищенного режима, в котором процессор функционирует как 8086. На одном процессоре в таком режиме может параллельно исполняться несколько задач с изолированными друг от друга ресурсами. При этом использование физического адресного пространства памяти управляется механизмами сегментации и трансляции страниц. Попытки выполнения недопустимых команд, выхода за рамки отведенного пространства памяти и разрешенной области ввода-вывода контролируются системой защиты.
«Неофициальный» режим Big Real Mode, он же Unreal Mode, который поддерживают все 32-разрядные процессоры, позволяет адресоваться ко всему 4-гигабайтному пространству памяти. В этом режиме инструкции исполняются так же, как и в реальном режиме, но с помощью дополнительных сегментных регистров FS и GS программы получают непосредственный доступ к данным во всей физической памяти.
Процессоры, начиная с Pentium и некоторых моделей 486, поддерживают также особый режим системного управления System Management Mode (SMM), при котором процессор выходит в иное, изолированное от остальных режимов пространство памяти. Этот режим используется в служебных и отладочных целях.
Процессоры могут оперировать с 8-, 16- и 32-битными операндами, строками байт, слов и двойных слов, а также с битами, битовыми полями и строками бит.
В этой главе рассмотрим базовую программную модель, общую для всех существующих на данный момент 32-разрядных процессоров х86. Эта модель охватывает набор регистров процессора, организацию памяти и ввода-вывода, типы данных, систему команд, прерывания и исключения.
Типы данных
Рассматриваемые процессоры непосредственно поддерживают (используют в качестве операндов) знаковые и беззнаковые целые числа, строки байт, цифр и символов, битовые строки, указатели и числа с плавающей точкой [1,31-34]. В семействе х86 принято, что слова записываются в двух смежных байтах памяти, начиная с младшего. Адресом слова является адрес его младшего байта. Двойные слова записываются в четырех смежных байтах, опять-таки начиная с младшего байта, адрес которого и является адресом двойного слова. Этот порядок называется Little-Endian Memory Format. В других семействах процессоров применяют и обратный порядок - Big-Endian Memory Format, в котором адресом слова (двойного слова) является адрес его старшего байта, а младшие байты располагаются в последующих адресах. Для взаимного преобразования форматов слова имеется инструкция XCHG, двойного слова – BSWAP.
Форматы данных, обрабатываемых целочисленным блоком АЛУ всех 32-разрядных процессоров.
• Бит (Bit) - единица информации. Бит в памяти задается базой (адресом слова) и смещением (номером бита в слове).
• Битовое поле (Bit Field) - группа до 32 смежных бит, располагающихся не более чем в 4 байтах.
• Битовая строка (Bit String) - набор смежных бит длиной до 4 Гбит.
• Байт (Byte) - 8 бит.
• Числа без знака: байт/слово/двойное/учетверенное слово (Unsigned Byte/ Word/Double Word/Quade Word), 8/16/32/64 бит.
• Целые числа со знаком: байт/слово/двойное/учетверенное слово (Integer Byte/ Word/Double Word/Quade Word). Единичное значение самого старшего бита (знак) является признаком отрицательного числа, которое хранится в дополнительном коде.
• Двоично-десятичные числа (BCD - Binary Coded Decimal):
• 8-разрядные упакованные (Packed BCD), содержащие два десятичных разряда в одном байте;
• 8-разрядные неупакованные (Unpacked BCD), содержащие один десятичный разряд в байте (значение бит 7:4 при сложении и вычитании несущественно, при умножении и делении они должны быть нулевыми).
• Строки байт, слов и двойных слов (Bit String, Byte String, Word String, Double Word String) длиной до 4 Гбайт.
• Указатели:
• длинный указатель (48 бит) - 16-битный селектор (или сегмент) и 32-битное смещение;
• короткий указатель - 32-битное смещение;
• просто указатель (32 бит, единственный тип указателя для 8086 и 80286) - 16-битный селектор (или сегмент) и 16-битное смещение.
Шестнадцатиразрядные процессоры из приведенных типов данных не поддерживают учетверенные слова всех типов, битовые поля и строки, строки двойных слов, короткие и длинные указатели.
Числа в формате с плавающей точкой и упакованные 80-битные BCD-числа обрабатываются блоками FPU процессоров класса 486 и выше, а также сопроцессорами 8087/287/387. Упакованные 64-битные и 128-битные данные обрабатываются процессорами с ММХ и SSE.
Действительные числа в формате с плавающей точкой:
• одинарной точности (Single Precision), 32 бит - 23 бит мантисса, 8 бит порядок;
• двойной точности (Double Precision), 64 бит - 52 бит мантисса, 11 бит порядок;
• повышенной точности (Extended Precision), 80 бит - 64 бит мантисса, 15 бит порядок.
• Двоично-десятичные 80-битные упакованные числа (18 десятичных разрядов и знак).
• Упакованные действительные числа одинарной точности а формате с плавающей точкой, обрабатываются блоком ХММ.
• Упакованные целые числа, знаковые и беззнаковые, обрабатываются блоком ММХ:
• упакованные байты (Packed byte) - восемь байт;
• упакованные слова (Packed word) - четыре слова;
• упакованные двойные слова (Packed doubleword) - два двойных слова;
• учетверенное слово (Quadword) - одно слово.
Для 16-разрядных процессоров, естественно, все форматы чисел для блоков ММХ и ХММ недоступны.
2.1.3. Регистры процессора
Процессоры х86 имеют регистры, подразделяющиеся на следующие категории [1,31-34]:
• регистры общего назначения;
• указатели инструкций;
• регистр флагов;
• регистры сегментов;
• системные адресные регистры;
• управляющие регистры;
• регистры отладки;
• регистры тестирования;
• модельно-специфические (зависящие от конкретной модели процессора) регистры.
Регистры общего назначения относятся к видимой для прикладных программ части архитектуры х86 и представляют собой расширение набора регистров 16-разрядных процессоров 8086/8088 и 80286 [33, 35, 36]. У 16-разрядных процессоров регистры общего назначения AX, BX, CX, DX состоят из двух 8-битных половинок, к которым можно независимо обращаться по символическим именам АН, ВН, СН, DH (старшие байты - High) и AL, BL, CL, DL (младшие байты - Low). Регистры-указатели SP (Stack Pointer - указатель стека), ВР (Base Pointer - базовый регистр) и индексные регистры SI (Source Index - индекс источника), DI (Destination Index - индекс назначения) допускают только 16-битное обращение. Адрес текущей инструкции хранится в 16-битном указателе команд IP (Instruction Pointer). Регистры в командах могут адресоваться явно. В ряде команд подразумевается неявное использование регистров:
• AX - умножение, деление, ввод и вывод слова;
• AL - умножение, деление, ввод и вывод байта; десятичная арифметика, трансляция (XLAT);
• АН - умножение и деление байта;
• BX - трансляция;
• CX - счетчик циклов и указатель длины строковых операций;
• CL - сдвиги с указанием переменной;
• DX - умножение и деление слова, ввод и вывод с косвенной адресацией;
• SP - операции со стеком;
• SI, DI - строковые операции.
В процессорах IA-32 все эти регистры расширены до 32 бит и к прежнему обозначению их имен добавилась приставка Е (Extended - расширенный). Отсутствие приставки в имени означает ссылку на младшие 16 бит расширенных регистров. Существуют понятия разрядности адреса и данных. Разрядность адреса определяет, сколько бит (16 или 32) используется в регистрах, формирующих адрес данных или инструкций, расположенных в памяти. Разрядность данных определяет, сколько бит (16 или 32) используется в инструкциях, оперирующих словами (инструкции с байтами всегда оперируют с 8 битами). В реальном режиме по умолчанию разрядность адреса и данных - 16 бит. В защищенном режиме разрядность адреса и данных по умолчанию определяется дескриптором кодового сегмента. Инструкции, которые прежде адресовались к 16-разрядным регистрам, теперь могут адресоваться и к 32-разрядным расширенным при том же коде операции. Что именно подразумевается в данный момент, определяется текущим значением разрядности слова операнда по умолчанию (16 или 32 бит) и может быть изменено на противоположное значение с
помощью префикса SIZ. Как и в 8086, возможно независимое обращение к младшему и старшему байтам регистров АХ, ВХ, СХ и DX.
Процессор содержит 16 регистров, которые могут использоваться прикладными программами. Как показано на рис. 2.1, эти регистры могут быть сгруппированы следующим образом [1, 31-34].
1. Регистры общего назначения. Эти восемь 32-битовых регистра доступны для использования программистами.
Регистрами общего назначения (РОН) являются 32-битовые регистры EAX, EBX, ECX, EDX, EBP, ESI и EDI. Данные регистры используются для хранения 8, 16 и 32 операндов (рис. 2.1). Они также могут использоваться для хранения операндов при вычислении адресов, за исключением регистра ESP, который не может быть использован для хранения индекса. Все РОН могут использоваться для вычисления адреса и формирования большинства арифметических и логических операций. Однако некоторые команды используют отдельные регистры для хранения операндов. Например, команды обработки строк используют содержимое регистров ECX, ESI, EDI в качестве операндов. Использование указанных регистров для этих целей позволяет более компактно кодировать команды. Следующие команды используют фиксированные регистры: умножения и деления с двойной точностью, ввода-вывода, обработки строк, перекодирования, циклического сдвига, операции со стеком.
2. Сегментные регистры. Данные регистры хранят селекторы сегментов, соответствующих различным формам доступа к памяти [33, 34]. Например, существуют отдельные сегментные регистры для доступа к программной области и стеку. Эти шесть сегментных регистров (рис. 2.2) определяют сегменты памяти, доступные в каждый момент времени.
Сегментирование обеспечивает разработчикам системы гибкость при выборе различных моделей организации памяти. Сегментние регистры содержат 16-битные селекторы сегментов, адресующих таблицы в памяти, в которых хранятся базовые адреса каждого сегмента и другая информация, определяющая доступ к памяти. При использовании несегментированной модели все сегменты отображаются в единое адресное пространство в физической памяти (рис. 2.2).
В любой момент времени до шести сегментов памяти непосредственно доступны программе. Сегментные регистры CS, DS, SS, ES, FS и GS хранят селекторы сегментов для этих шести сегментов. Каждый регистр ассоциируется с доступом к одному из возможных сегментов (кода, данных или стеку). Каждый регистр указывает на конкретный сегмент, используемый программой и имеющий определенный тип доступа (рис. 2.3). Остальные сегменты могут быть использованы путем загрузки их селекторов в сегментные регистры.
Сегмент, содержащий выполняемые команды, называется сегментом кода, и его селектор находится в регистре CS. Процессор выбирает команды кодового сегмента, используя содержимое указателя команд EIP как смещение внутри сегмента. Регистр CS загружается в результате выполнения прерываний, особых случаев и команд передачи управления между сегментами (например, команды CALL, IRET, JMP). Перед вызовом процедуры должна быть выделена область памяти под стек. В стеке хранятся адрес возврата, параметры вызываемой процедуры и временные переменные.
Все операции со стеком используют регистр SS при обращении к сегменту стека. В отличие от регистра CS регистр SS может быть загружен явно, что позволяет прикладным программам определять стеки.
Регистры DS, ES, FS, GS являются регистрами сегментов данных и позволяют организовать эффективный и безопасный доступ к различным структурам данных. Например, раздельные сегменты данных могут быть созданы для структур данных текущего программного модуля, данных, полученных из модуля более высокого уровня динамически создаваемых структур данных и данных, разделяемых с другой программой. Механизм сегментации позволяет ограничить влияние от некорректно выполняемых программ вследствие появления ошибок только в сегментах, которые используются этими программами.
В зависимости от структуры данных и распределения их по сегментам программа может получить доступ более чем к четырем сегментам данных. Для доступа к дополнительным сегментам регистры DS, ES, FS, GS могут быть загружены из прикладной программы во время ее выполнения. Единственным требованием является то, что инициализация соответствующего сегментного регистра должна быть выполнена до обращения к данным сегмента.
Базовый адрес хранится для каждого сегмента. Для адресации данных внутри сегмента 32-битовое смещение прибавляется к базовому адресу сегмента. Операнд в сегменте адресуется посредством задания смещения в команде или в регистре общего назначения. Специальные правила определяют, какой сегментный регистр используется для адресации сегмента.
1. Регистры состояния и управления. Данные регистры отображают и позволяют модифицировать состояние процессора [33, 34]..
Регистр флагов EFLAGS является расширением регистра FLAGS до 32 бит. Биты 0-15, определенные для 8086 и 80286, имеют прежнее назначение [34]. Флаги состояния OF, SF, ZF, AF, PF и CF хранят признаки результатов выполнения арифметических и логических операций над операндами, расположенными в регистрах общего назначения и в памяти (исполнение инструкций блоками FPU, ММХ и ХММ держится особняком). Операции пересылки данных на флаги состояния влияния не оказывают. Значение этих флагов анализируется при исполнении условных инструкций. Кроме флагов состояния в регистре имеются управляющие и системные флаги, влияющие на поведение процессора, в том числе на обработку маскируемых аппаратных прерываний (IF) и на направление движения в строковых операциях (DF). По сравнению с 80286, появились биты VM и RF, ряд флагов добавился с появлением процессоров 4-го и 5-го поколений. Содержимое регистра флагов (FLAGS или EFLAGS) может быть сохранено в стеке и восстановлено из него, но ряд системных флагов в защищенном режиме управляем и наблюдаем не на всех уровнях привилегий. Флаги состояния могут быть скопированы в регистр АН и, наоборот, загружены из него. Кроме того, флаги состояния могут быть загружены из блока FPU, и тогда результаты выполнения инструкций в FPU можно использовать в условных инструкциях.
Назначение бит регистра EFLAGS описано ниже [33, 34].
ID (Id Flag) - флаг доступности команды идентификации CPUID (P5 и выше, а также некоторые 486).
VIP (Virtual Interrupt Pending) - виртуальный запрос прерывания (P5 и выше).
VIF (Virtual Interrupt Flag) - виртуальная версия флага IF (разрешения прерывания) для многозадачных систем (P5 и выше).
AC (Alignment Check) - флаг контроля выравнивания. При исполнении программ с уровнем привилегий 3 в случае обращения к операнду, который не выровнен по соответствующей границе (2, 4, 8 байт), и при установленном флаге АС произойдет исключение #АС с нулевым кодом ошибки (о мнемониках исключений см. п. 2.5). На уровнях привилегий 0, 1, 2 контроль выравнивания не производится (486 и выше).
VM (Virtual 8086 Mode) - в защищенном режиме включает режим виртуального процессора 8086. Попытка использования привилегированных инструкций в этом режиме вызовет исключение #GP. Бит может устанавливаться только в защищенном режиме: инструкцией IRET на нулевом уровне привилегий или переключением задач на любом уровне привилегий. На бит не действует инструкция POPF, а инструкция PUSHF в этот бит всегда заносит 0. Его единичное значение может сохраниться только в образе EFLAGS, сохраняемом при прерывании, переключении задач или переходе в режим SMM.
RF (Resume Flag) - флаг возобновления, используется совместно с регистрами точек останова.
IOPL (Input/Output Privilege Level) - уровень привилегий ввода-вывода.
NT (Nested Task Flag) - флаг вложенной задачи.
OF (Overflow Flag) - флаг переполнения. Устанавливается, если результат арифметической операции не умещается в операнде назначения.
DF (Direction Flag) - флаг управления направлением в строковых операциях. При единичном значении индексные регистры, участвующие в строковых операциях, автоматически декрементируются на количество байт операнда, при нулевом - инкрементируются. Флаг управляется программно, инструкциями CLD и STD.
IF (Interrrupt-enable Flag) - флаг управления прерываниями. При единичном значении разрешается выполнение маскируемых аппаратных прерываний. На этот флаг можно воздействовать программно, явными инструкциями (CLI и STI) и неявными инструкциями восстановления регистра флагов; процессор манипулирует флагом и автоматически, при обработке прерываний.
TF (Trap Flag) - флаг трассировки (пошагового режима). При его установке после выполнения каждой команды вызывается внутреннее прерывание типа 1 (INT 1).
SF (Sign Flag) - флаг знака. Указывает на единичное значение старшего бита результата - признак отрицательного числа.
ZF (Zero Flag) - флаг нулевого результата.
AF (Auxiliary Flag) - флаг дополнительного переноса (заема) в тетраде для десятичной арифметики.
PF (Parity Flag) - флаг паритета, устанавливается при четном числе единиц результата.
CF (Carry Flag) - флаг переноса (заема) старшего бита в арифметических операциях. Этот флаг может быть программно установлен или сброшен специальными инструкциями (STC, CLC, CMC), благодаря этому свойству его широко используют для сигнализации условия завершения процедур (например, сигнализации об ошибках).
Указатель команд. Указатель команд EIP содержит смещение в текущем сегменте кода. Он непосредственно недоступен программисту и управляется явно командами передачи управления (переходы, возвраты и т. Д.), прерываниями и особыми случаями. Так как используется предвыборка команд в процессор, то значение EIP указывает на загружаемую в процессор команду, а не на выполняемую команду в процессоре.
Форматы команд
Информация, закодированная в команде, включает код операции, тип операндов для данной операции и адреса размещения этих операндов [33, 34]. Если операнд находится в памяти, то в команде содержится явное или неявное указание на сегмент, содержащий указанный операнд.
Общий формат команд процессора приведен на рис. 2.4, где обозначены: Base – база, mod – режим, reg/m – регистр/память, Index – индекс, Scale – масштаб.
Команды состоят из отдельных полей и имеют различные форматы. Из всех описанных ниже полей команд только код операции обязательно присутствует в команде. Остальные поля могут отсутствовать, что определяется операцией, местом хранения операндов, их типом [35, 36].
Префиксы. Один или более байтов, предшествующих команде и модифицирующих операцию, выполняемую командой. Следующие префиксы могут использоваться в прикладных программах [32-34]:
Замена сегмента, которая указывает в явной форме на используемый сегментный регистр выполняемый командой вместо сегментного регистра, используемого по умолчанию.
Размер адреса, который определяет размерность адреса в 16 бит или 32 бита. Любая из этих разрядностей может быть выбрана по умолчанию, префикс выбирает определенную разрядность.
Размер операнда, который определяет размерность данных, равную 16 битам или 32 битам. Любая из этих разрядностей может быть выбрана по умолчанию, префикс выбирает определенную разрядность данных.
Повторение, которое используется с командами обработки строк. Обеспечивает обработку каждого элемента строки одной последовательностью команд.
Код операции. Определяет операцию, выполняемую командой. Некоторые операции имеют несколько кодов, определяющих модификации операции.
Спецификатор регистра. Команда может определять один или два регистра для хранения операндов (байты mod/reg и sib).
Спецификатор режима адресации. Он определяет место хранения операнда в регистре или памяти. Если операнд хранится в памяти, то спецификатор определяет необходимось использования смещения, базового регистра, индексного регистра и масштабирования.
SIB (ss, Index, Base) байт. Когда спецификатор режима адресации указывает на использование индексного регистра для вычисления адреса операнда, байт SIB включается в команду для определения базового регистра, индексного регистра и масштабного коэффициента, равного 1, 2,4 или 8.
Непосредственный операнд. Непосредственные операнды могут быть 8-, 16- или 32-битными. В тех случаях, когда 8-битный непосредственный операнд используется в команде вместе с 16- или 32-битным операндом, процессор расширяет его с учетом знака. Таким же образом 16-битный операнд преобразуется в 32-битный.
Смещение. Когда спецификатор режима адресации указывает, что для операнда будет использоваться смещение, оно включается в команду. Смещение представляет собой 8-, 16- или 32-битовое целое число со знаком. Восьмибитовая форма используется в тех случаях, когда значение смещения достаточно мало. Процессор расширяет 8-битовое смещение до 16 или 32 бит путем знакового расширения
Выбор операнда
Команда может не использовать операнды, использовать один или более операндов. Примером безоперандной команды может служить команда NOP (нет операций). Операнд может находиться [32-34]:
-в команде;
-в регистре (32-битные операнды в регистрах EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP; 16-битные операнды в регистрах AX, BX, CX, DX, SI, DI SP или BP; 8-битные операнды в регистрах AH, AL, BH, BL, CH,CL, DH или DL; в сегментных регистрах, в регистре флагов).
Для большинства команд один из двух явно адресуемых операндов является операндом-источником или операндом-приемником и может находиться в регистре или памяти. Другой операнд должен быть в регистре или указан непосредственно в команде. Имеются следующие типы двухоперандных команд:
-регистр- регистр;
-регистр- память;
-память-регистр;
-непосредственный операнд-регистр;
-непосредственный операнд-память.
Режимы адресации
Неявная адресация. Операнд адресует неявно, если в команде нет специальных полей его определения, т.е. операнд задается кодом операции.
Примерами команд с неявной адресацией могут служить:
AAA – скорректировать регистр AL после сложения;
CMC – инвертировать флажок переноса;
STD – установить в 1флажок направления.
Регистровая адресация. В командах с таким режимом адресации операнд(ы) находится во внутреннем регистре процессора [33, 34]. Регистровые операнды в ассемблерных командах указываются именами регистров в поле операнда. Наиболее часто в командах манипуляций данными участвуют 8/16/32-битные РОН. Привлекаемые в командах регистры определяются полями reg и mod r/m (при mod=11B). В сокращенных формах команд регистры могут указываться в поле операции, особенно это относится к регистрам-аккумуляторам EAX/AX/AL. Сегментные регистры в командах загрузки и сохранения идентифицируются полями sreg2 или sreg3, занимающими место поля reg в байте mod r/m.
Примеры команд с регистровой адресацией:
INC ESI – инкремент регистра ESI;
SUB ECX,ECX – сбросить регистр ECX;
MOV EAX,CR0 – передать в EAX содержимое CR0;
ADD AL,DL – прибавить к AL содержимое регистра DL;
MOVSX EAX,DH – переслать со знаковым расширением.
Непосредственная адресация. В этом режиме операнд находится в самой команде, т.е. хранится в месте с командой в сегментном коде. Из-за этого изменить непосредственный операнд невозможно, им может быть только константа как операнд-источник. Допускаются непосредственные операнды длиной 8, 16 и 32 бита; они всегда находятся в конце команды. Использование непосредственных операндов обычно определяется неявно, а байт mod r/m задает получатель.
Примеры команд с непосредственной адресацией:
MOV EAX,0f0f0f0f0h - загрузить константу в EAX;
AND AL,0fh – выделить младшую тетраду регистра AL;
BT EDI,3 – передать в CF бит 3 регистра EDI.
Адресация ввода-вывода. Процессоры 80х86 могут обращаться к устройствам ввода-вывода двумя способами. Они могут быть отображены на память или иметь свои адреса в пространстве ввода-вывода. Процессор поддерживает 64К адресов ввода-вывода, обычно называемых портами ввода-вывода.
В командах ввода-вывода источником или приемником всегда служит аккумулятор EAX/AX/AL, а порт определяется как непосредственный операнд (фиксированный порт) или содержимое регистра DX (переменный порт).
Примеры команд ввода-вывода:
IN AL,40h –ввод байта из фиксированного порта;
IN AX,40h - ввод слова из фиксированного порта;
IN EAX,40h- ввод двойного слова из фиксированного порта;
OUT 20h,AL- вывод байта в фиксированный порт;
OUT 20h,AX- вывод слова в фиксированный порт;
OUT 20h,EAX- вывод двойного слова в фиксированный порт;
IN AL,DX - ввод байта из переменного порта (адрес порта содержится в регистре DX);
IN AX,DX- ввод слова из переменного порта;
IN EAX,DX- ввод двойного слова из переменного порта;
OUT DX,AL- вывод байта в переменный порт (адрес порта содержится в регистре DX);
OUT DX,AX- вывод слова в переменный порт;
OUT DX,EAX- вывод двойного слова в переменный порт.
Адресация операндов в памяти. Напомним, что эффективный адрес задает смещение (расстояние) от начала соответствующего сегмента. Адрес 0 есть адрес первого байта в сегменте, адрес 1-второго байта и т.д., независимо от физического начального или базового сегмента. В большинстве команд манипуляции данными по умолчанию привлекается сегмент, адресуемый регистром DS, но с помощью префикса замены сегмента можно обращаться к любому другому сегменту.
Прямая адресация. Это простейший режим адресации (он называется также абсолютной адресацией), т.к. эффективный адрес содержится в самой команде. Местонахождение операнда задается смещением в текущем сегменте, которое следует считать константой. Численное значение адреса в ассемблерных командах заключается в квадратные скобки.
Примеры команд с прямой адресацией:
MOV AL, [20h]-передать байт в регистр AL;
SHL WORD PTR [A5h],5 – сдвинуть слово на пять бит влево;
INC DWORD PTR[12345h] – инкремент двойного слова в памяти.
Отметим, что во второй и третьей командах применяется спецификатор длины операнда, т.к. без него невозможно определить, с какими данными должна работать команда.
Вопросы для самоконтроля к главе 2
1. Назначение и области применения МП
2. Форматы команд микропроцессоров Intel 80i86. Назначение полей команд.
3. Назначение РОН и регистра флажков МП. Назначение регистра флажков и его связь с командами условного перехода.
4. Расположение команд в памяти МП и последовательность их выполнения.
5. Режимы адресации МП Intel 80x86 и их сравнительный анализ. Примеры.
6. Сегментные регистры и их назначение. Сегментированная модель памяти.
7. Стек. Назначение и организация стека. Принцип работы стека.
8. Система команд МП Intel 80i86. Команды обращения к внешним устройствам и их отличительные особенности.
9. Команды МП Intel 80i86 для работы с 8-, 16- и 32-битными данными. Примеры команд и их анализ.