Указатель инструкций (IP)




Указатель команд - это 16-битовый регистр, который содержит смещение очередной команды. Как показано в предыдущем пункте, Процессор использует регистр CS совместно с регистром IP для формирования 20-битового физического адреса. Регистр CS определяет сегмент выполняемой программы, а IP задает смещение. Поскольку в задании адреса очередной команды участвует два регистра, существует несколько способов задать ход выполнения программы. Наиболее обычный из этих способов осуществляется при нормальном выполнении программы. При извлечении процессором команды из памяти и ее выполнении значение регистра IP увеличивается на размер команды в байтах. Теперь пара CS:IP указывает на следующую команду.

Для изменения порядка выполнения команд используются команды перехода. Команда перехода одного вида изменяет только регистр IP и дает переход внутри одного сегмента. Этот тип перехода называется внутри сегментным или близким (NEAR) переходом. Спецификация для него требует лишь новое значение для регистра IP. Регистр CS остается без изменений. Близкий переход может передавать управление только внутри текущего сегмента, поэтому дальность перехода ограничена сверху 64K байт. Для перехода к более отдаленному участку программы требуется переход другого типа.

Переход второго типа называется межсегментным или далеким (FAR) переходом. При этом переходе процессор назначает новые значения как для IP так и для CS. Этот переход позволяет выполнять новую программу расположенную в любом месте адресного пространства 8088. Но для выполнения такого перехода команда должна определить новые значения для обоих регистров - CS и IP. При прямом переходе это требует пяти-байтовой команды: один байт на код операции и по два байта для регистров CS и IP.

Указатель стека

Регистр указателя стека (SP) - это 16-битовый регистр, который определяет текущее смещение вершины стека. Процессор использует указатель стека совместно с регистром сегмента стека для формирования физического адреса. Процессор использует пару регистров SS:SP для всех стековых ссылок, включая PUSH, POP, CALL и RETURN. Пара SS:SP всегда указывает текущую вершину стека. Когда команда помещает в стек слово, регистр SP уменьшается на два. При извлечении из стека слова процессор увеличивает регистр SP на два. Стек растет в направлении меньших адресов памяти.

Все стековые операции используют значения размером в слово. Отдельный байт не может быть ни помещен в стек ни взят из него. Процессор изменяет регистр SP для того чтобы отразить действия над стеком. На регистр SS ни одна из стековых операций не влияет. Программа устанавливает регистр SS независимо от какой либо операции PUSH (поместить в стек) или POP (извлечь), после чего он указывает на сегмент стека. Это означает, что системный стек ограничен в размере 64 килобайтами. Например, если программа устанавливает регистр SS в 1000H, а регистр SP - на 0, то первое, что будет помещено в стек, разместится поадресам 1000:FFFFH и 1000:FFFEH. Последовательно помещаемые в стек данные будут размещатьсяв нем по все более младшим адресам, пока последний объект не будет расположен в 1000:0001H и 1000:0000H. Если программа поместит в стек в этот момент еще что-нибудь, то оно разместитсяв 1000:FFFFH и 1000:FFFEH, то есть в первых байтах используемых стеком. Поскольку стек теперь "замкнулся", ранее помещенные в него данные разрушены.

При нормальном использовании длина стека не достигает 64K. Если программа устанавливает стек в 512 байт, например,то она может инициализироватьпару SS:SP как 1000:2000H. Первая ячейка стека будет 1000:01FFH, а последняя доступная - 1000:0000H. Если программа поместит в стек более 256 слов, уменьшение регистра SP вызовет проход его значения через нуль иприведет к размещению данных сначала сегмента стека. После этого программа будет помещать стековые данные в область, которая в данном случае не предназначалась для стека - начиная с 1000:FFFFH. При этом может произойти одна из двух неприятных вещей. Стек может перекрыть коды или данные программы и разрушить их, либо стековые данные будут направляться в пространство, которое не имеет физической памяти.

Любую из этих вещей очень трудно обнаружить при отладке программы, поэтому единственный выход - оставлять для стека как можно больше места. В случае персонального компьютера IBM, использующего дисковую операционную систему IBM рекомендуется размер стека не меньше 128 байт. Это дает достаточно места для удовлетворения потребностей в стеке различных служебных программ DOS и системы вместе с обычными запросами самой программы.

Регистр флагов

Последний управляющий регистр - 16-битовый регистр флагов. Этот регистр содержит информацию, которая используется побитно, а не в качестве 16-битового числа. Биты флагового регистра имеют значение для процессора по-отдельности. Некоторые из этих бит содержат коды условий, установленные последней выполненой командой. Программа пользуется этими кодами для управления своим выполнением. Программа может тестировать коды условий и на основе полученных значений выбирать последовательность выполнения. Другие биты в регистре флагов показывают состояние процессора при выполнении текущей команды. Эти биты управляются специальными командами.

Регистр флагов лучше всего описывать последовательно, по одному биту. Структура регистра флагов показано на Фиг. 3.10. Заметим, что здесь определены не все биты. Остальные зарезервированы, то есть в настоящее время их значение не определено. Однако в дальнейших версиях процессора они могут быть использованы для каких-нибудь специальных целей. Поэтому никогда не следует расчитывать на неизменность значения зарезервированных бит.

номер бита                                
Мнемоника x x x x OF DF IF TF SF ZF x AF x PF x CF

Фиг. 3.10 Регистр флагов

Все флаги младшего байта регистра устанавливаются арифметическими или логическими операциями процессора. Например, операция ADD устанавливаетвсе флаги в младшем байте в соответствии с ее результатом. За исключением флага переполнения, все флаги старшего байта устанавливаются специально предназначенными для этого командами. Флаги старшего байта отражают состояние процессора 8088 и будут влиять на режим выполнения программы. Флаги в младшем байте - это коды условия и могут быть испольльзованы в командах условных переходов для изменения порядка выполнения программы.

Флаг знака

Флаг знака (SF) показывает, является результат последней арифметической операции положительным или отрицательным. Установка бита знака отражает значение старшего бита последнего результата. Если последний результат отрицателен, то бит знака устанавливается в еденицу, а если положительный или нулевой, то - в ноль.

Флаг нуля

Флаг нуля (ZF) показывает, что результат последней операции равнялся нулю. Этот флаг используется в программах для проверки двух чисел на равенство. Допустим, в программе вычитаются два числа. Результат будет нулевым, если значения идентичны и не нулевым, если они различны.

Флаг четности

Флаг четности (PF) показывает, является ли число едениц результата последеней операции четным. Четность - это способ контроля значений данных. Бит четности - это дополнительный бит, который проверяет значения других бит. Программа может использовать флаг четности для определения, в какое значение следует установить бит четности. Четность используется в оперативной памяти IBM PC для контроля сохраненных в ней данных. Такой контроль четности выполняется непосредственноаппаратными средствами и не влияет на бит флага четности. Флаг четности устанавливается в "1", если результат операции имеет четное число едениц и переустанавливается в "0", если число едениц результата нечетно. В обычных арифметических и логических операциях знак четности использкется мало.

Флаг переноса

Флаг переноса (CF) служит для поддержания процессором многоразрядной арифметики. Обычно при выполнении арифметических операций вроде сложения или вычитания 8088 может работать с не более чем 16-битовыми числами. Однако в некоторых случаях приходится манипулировать с числами превышающими 2**16. Например, для сложения двух 32-битовых чисел программе придется сложить сначала младшие части чисел, а затем - старшие. На Фиг 3.11 показано сложение 32-битовых чисел 22223333H и 44445555H. В этом примере складываются с начала младшие 16-битовые значения с получением результата 8888H. Затем складываются старшие 16-битовые значения с результатом 6666H. 32-битовый результат равен 66668888H.

 

второе сложение первое сложение
   
   
   

Фиг. 3.11 32-битовое сложение

Для получения 32-битового результата требуется два 16-битовых сложения. Для 48-битового числа потребуется уже три 16-битовых сложения и т.д. Для выполнения сложения программа должна расчленять каждое большое число на 16-битовые куски. Однако, приведенный пример достаточно прост. Результат первого 16-битового сложения не влиял на второе. В общем же случае сложения возможен перенос из одной позиции в другую. Когда процессор выполняет слоожение двух 16-битовых чисел, он автоматически выполняет переносы. Когда же программа складывает два 32-битовых числа, как в нашемпримере, то ей приходится запоминать перенос в первом сложении и использовать его при сложении вторых 16-битовых значений. На Фиг. 3.12 показано сложение чисел 22224444H и 3333EEEEH. В этом примере перенос от первого сложения отражается на втором сложении.

 

второе сложение первое сложение
   
  EEEE
  1.3332
1 (перенос от первого сложения)

Фиг. 3.12 32-битовое сложение с переносом

Первое 16-битовое сложение 4444H и EEEEH дает результат 13332H. Поскольку результат имеет длину 17 бит, он не может быть помещен в 16-битовый регистр. Флаг переноса регистра состояний примет этот дополнительный бит арифметической информации. При втором 16-битовым сложении складываются не только числа 2222H и 3333H, но и значение флага переноса.

Существует две формы команды сложения: команда ADD складывает два 16-битовых числа, давая 17-битовый результат, а команда сложения с переносом ADC складывает два 16-битовых числа и значение флага переноса, давая также 17-битовый результат. В примере на рис. 3.12 для первой операции сложения использовалась команда ADD, а для второй операции сложения команда ADC.

Оба приведенных примера используют флаг переноса для выполнения арифметики повышенной точности. В первом примере после сложения 3333H и 5555H получился нулевой перенос; когда команда ADC прибавляет значение переноса к числам 2222H и 4444H, получается правильный результат 6666H. Во втором примере флаг переноса был установлен, так как был перенос из младшей части суммы в старшую.

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

Флаг переноса служит и для другой важной цели. Когда программа выполняет вычитание, существует возможность заема из одной позиции в другую. Флаг переноса показывает при вычитании необходимость заема из одной части числа в другую. Вычитать целые числа, в несколько слов длиной программа может таким же путем, как и складывать. С начала вычитаются младшие части чисел, с получением 16-битового результата. Команда вычитания (SUB) устанавливает флаг переноса, отражая заем. Следующее 16-битовое вычитание программа выполняет с заемом. Команда вычитания с заемом (SBB) наряду с обычным вычитанием вычитает из результата флаг переноса. Как и при сложении программа может осуществлять вычитание целых чисел произвольной длины, используя флаг переноса в качестве значения заема.

Микропроцессор 8088 трактует флаг переноса как истинный заем, то есть если в результате вычитания появляется заем, микропроцессор устанавливает флаг переноса равным 1. Он показывает, что программа должна вычесть 1 из результата вычитания старших частей чисел. Если заема нет, процессор сбрасывает флаг переноса на ноль. Это означает, что программе не нужно вычитать 1 из старшей части числа. Микропроцессор устанавливает флаг переноса как индикатор заема при расширенном вычитании. Наряду с расширением точности программа может использовать флаг переноса для определения соотношения двух чисел. Если флаг переноса установлен, вычитаемое значение больше уменьшаемого; если флаг переноса не установлен, вычитаемое значение меньше или равно уменьшаемому. Это означает, что флаг переноса становится первичным индикатором при определении соотношения двух чисел: после того, как программа вычитает два числа, флаг переноса указывает, какое из них больше. Таким способом программа может проверять целые числа без знака, включая такие приложения, как сортировка строк символов. В случае чисел со знаком для определения соотношения чисел программе нужна дополнительная информация. В следующей главе в разделе "Условные переходы" обсуждаются все способы тестирования чисел.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: