Регистровая модель процессора x86.
МП Intel 80х86 или просто х86 является самым распространенным микропроцессором общего назначения. На его основе выполняются микро-ЭВМ, как универсального назначения, в т.ч. персональные компьютеры, так и специализированные: логические и регулирующие контроллеры, одноплатные и встраиваемые в оборудование - а также измерительные и управляющие комплексы реального времени. Особенностями его являются: наличие свойств 8, 16 и 32-х разрядных процессоров; возможность обработки слов в двоичном, двоично-десятичном кодах, строк данных и отдельных битов; наличие встроенных средств выполнения операций умножения и деления чисел. Для поддержки унаследованного ПО процессор х86 может, наряду с 32 разрядными инструкциями, выполнять и 16-разрядные.
Архитектура процессора
С точки зрения прикладного программиста процессор 80х86 имеет четыре 32-битовых регистра общего назначения EAX, EBX, ECX, EDX, четыре регистра-указателя ESI, EDI, EBP и ESP, шесть 16-битовых указателей сегментов CS, DS, ES, SS ,FS, GS и один 32-битовый регистр флагов, а также программный счетчик- EIP. Для программной совместимости с 16-разрядными процессорами все 32-битовые регистры имеют возможность обращения к младшему слову, а младшие слова регистров общего назначения для облегчения переноса программ, унаследованных от 8-разрядных процессоров, разбиты на два раздельно адресуемых байта.
Регистры общего назначения (РОН)
Регистр-аккумулятор EAX. Используется для хранения промежуточных данных и результатов. При делении однобайтовых чисел регистр используется для хранения частного и остатка. При делении двухбайтовых чисел в AX содержится младшие 16 бит 32-разрядного делимого. В командах обработки строковых данных регистр может содержать одно- и двухбайтовые данные. Если для обработки данных достаточно использовать 8-разрядные числа, то регистр AX можно рассматривать как два независимых 8-битовых регистра AH и AL, причем AH содержит старшие, а AL - младшие 8 бит.
Базовый регистр EBX. При базовых типах адресации регистр содержит адрес области памяти либо адрес, который суммируется для получения нового значения со смещением. При исполнении большинства операций с аккумулятором EAX регистр EBX может выполнять функции регистра общего назначения. При выполнении операций с 8-битовыми операндами регистр BX может рассматриваться как 2 регистра BH и BL.
Регистр-счетчик ECX. Предназначен для управления числом итераций в цикле или числом повторений в командах REP в строковых операциях. При выполнении операций с аккумулятором EAX он также может использоваться как РОН. Может использоваться, также как и регистр EBX, для косвенной адресации. При работе с 8-битовыми операндами регистр CX можно рассматривать как пару независимых 8-разрядных регистров CH и CL.
Регистр данных EDX. Используется как вторичный аккумулятор для хранения промежуточных данных и результатов. Также может использоваться в качестве базового при косвенной адресации. В командах умножения и деления он может использоваться вместе с регистром AX для формирования 32-разрядного числа, при этом он содержит старшую часть числа. При делении двухбайтовых чисел DX содержит остаток. При приеме или выводе информации на периферийные устройства регистр DX может использоваться для хранения адреса порта ввода-вывода. В однобайтовых операциях регистр DX можно рассматривать как два 8-битовых регистра DH и DL.
Индексные регистры и регистры-указатели
Индексный регистр-источник ESI. Используется в качестве указателя адреса байта или слова в строковых командах. При базово-индексной адресации содержимое регистра ESI может суммироваться с содержимым базового регистра. Для повышения эффективности выполнения содержимое регистра может автоматически возрастать или уменьшаться в режиме автоиндексации. Регистр может быть использован при выполнении большей части арифметических и логических операций.
Индексный регистр-приемник EDI. Используется как указатель назначения для адреса байта или слова в строковых командах. При базово-индексной адресации содержимое регистра EDI может суммироваться с содержимым базового регистра. Для повышения эффективности выполнения содержимое регистра может автоматически возрастать или уменьшаться в режиме автоиндексации. Регистр может быть использован при выполнении большей части арифметических и логических операций.
Регистр-указатель стека ESP. Используется для работы с данными в стековых структурах. Его содержимое указывает адрес элемента на вершине стека. Регистр ESP модифицируется аппаратно, и в прикладных программах не рекомендуется изменять его содержимое.
Регистр-указатель базы EBP. Используется как дополнительный указатель для работы с данными в стековых структурах. Регистр EBP может выполнять функции указателя на параметры или локальные переменные процедуры, находящиеся в стеке. В режиме базово-индексной адресации для получения адресов операндов содержимое регистра EBP может суммироваться с содержимым регистров ESI и EDI. Регистр EBP может использоваться в большинстве арифметических и логических операций. Но, поскольку этот регистр является основой рамки стека функции в языках высокого уровня, то использовать его в качестве регистра общего назначения на встроенном ассемблере настоятельно не рекомендуется.
Сегментные регистры
Использование и назначение сегментных регистров в реальном и защищенном режиме существенно различается. В реальном режиме сегментные регистры предназначены для преодоления барьера 64К при 16-разрядной адресации, и любая прикладная программа может явно менять и зачастую меняет их содержимое. В защищенном 32-разрядном режиме сегментные регистры предназначены для изолирования адресных пространств отдельных процессов друг от друга. Каждый процесс имеет свое виртуальное адресное пространство размером 4G, которое перекрывается 32-разрядными исполнительными адресами. Поэтому явная модификация содержимого сегментных регистров в прикладных программах защищенного режима практически никогда не требуется.
Регистр сегмента команд CS - 16-разрядный управляющий регистр, указывающий сегмент, содержащий адрес текущей команды. Его содержимое может быть изменено только при выполнении команд дальнего перехода JMP, CALL, RET, IRET. Ближние варианты JMP и CALL не изменяют содержимое регистра CS.
Регистр сегмента данных DS - 16-разрядный управляющий регистр. Его содержимое указывает начало зоны адресов, которая в общем случае включает программно изменяемые данные. Все прямые и косвенные адресные ссылки, использующие регистры BX, SI, или DI, определяются относительно регистра DS. Адресные ссылки в строчных командах, использующих регистр SI, также вычисляются относительно DS.
Регистры дополнительных сегментов данных ES, FS, GS - 16-разрядные управляющие регистры. Их содержимое указывает на начало области памяти, которая используется для динамически размещаемых данных. Адресные ссылки в командах работы со строками, использующих регистр DI, вычисляются относительно регистра ES.
Регистр сегмента стека SS - 16-разрядный регистр. Его содержимое указывает начало стековой структуры в памяти. Содержимое регистров SP и BP может использоваться для доступа к рамке стека функции с использованием косвенной адресации.
Указатель команд (программный счетчик) EIP - 32-разрядный регистр. Его содержимое указывает адрес следующей команды в сегменте, определяемом CS.
Регистр флагов - 32-разрядный регистр, содержащий информацию о текущем состоянии МП. При прикладном программировании используются в основном следующие флаги:
-флаг вспомогательного переноса AF. Используется при арифметических операциях над 8-разрядными числами в формате BCD для индикации переноса единицы из младших четырех битов в старшую тетраду или заема единицы из старшей тетрады в младшую.
-флаг переноса CF. Используется для индикации переноса в старший разряд или заема единицы из этого разряда при арифметических операциях над 8- 16- и 32-разрядными числами.
-флаг переполнения OF. Используется для индикации переполнения результатов при выполнении арифметических операций.
-флаг знака SF. Если SF установлен в 1, то результат отрицательное число, что соответствует 1 в самом старшем бите байта, слова или двойного слова, так как отрицательные числа в МП х86 представляются в дополнительном коде.
-флаг паритета PF. Используется для индикации четности числа битов в младшем байте результата. Если установлен в 1 - то число битов (но не само число) четное.
-флаг нуля ZF. Используется для индикации равенства нулю результата операций с байтами, словами или двойными словами.
-флаг направления DF. Используется преимущественно вместе с командами обработки строк. Когда DF равен 1, эти команды автодекрементируются. Содержимое SI и/или DI используемых в этих операциях, уменьшаются на 1, 2 или 4 в зависимости от команд.
-флаг разрешения прерывания IF. Используется для разрешения или запрета обработки внешнего маскируемого прерывания. Когда флаг сброшен в 0, прерывания запрещены.
-флаг трассировки TF. Используется для осуществления пошагового выполнения программ при их отладке.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|