Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КНИГА_АСМ ассемблер.doc
Скачиваний:
61
Добавлен:
19.11.2019
Размер:
732.16 Кб
Скачать
    1. Программная модель процессора.

Под программной моделью, понимается набор внутренних регистров и флагов процессора, которые, тем или иным образом доступны программисту. Мы с Вами рассмотрим программную модель процессора 8086 (рис. 2.7), которая является базовой для всех микропроцессоров фирмы Intel, вплоть до процессора Pentium IV.

Как видно из рис. 2.7, процессор включает в свой состав несколько групп 16 разрядных регистров. Регистры ax, cx, dx и bx составляют группу регистров общего назначения (РОНы). Основной функцией этих регистров является временное хранение промежуточных результатов вычислений.

Как видно из рисунка 2.7, любой РОН можно рассматривать как один 16 разрядный регистр или как два 8 разрядных регистра. Например, bx – шестнадцатиразрядный регистр, bh и bl –восьмиразрядные регистры, причем bh соответствует старшему, а bl – младшему байтам bx.

В процессорах фирмы Intel на каждый из РОНов, помимо основной, возлагается еще и ряд дополнительных функций. Например, регистр cx используется в качестве счетчика в команде цикла loop. Мы здесь не будем рассматривать особенности каждого регистра, а будем вводить эти особенности по мере дальнейшего изложения материала. Подчеркнем только, что единственным регистром и группы РОНов, который может быть использован для адресации памяти, является регистр bx. Иначе говоря, невозможны конструкции, в которых ax, cx или dx, а также ah, al, bh, bl, ch, cl, dh или dl стоят в квадратных скобках. Транслятор на такие конструкции будет «ругаться», выдавая сообщения об ошибках.

Регистры sp, bp, si и di составляют группу регистров-указателей. Основное их назначение – участвовать в формировании Аэф в командах обращения к памяти («стоять в квадратных скобках»). Но если в какой-либо момент какие-либо из этих регистров для этих целей не нужны, можно использовать эти регистры (кроме sp!!!) в качестве РОНов. Регистры-указатели могут быть только 16 разрядными!

Следующую группу составляют сегментные регистры, с которыми мы уже познакомились в разделе 2.6.

Рис. 2.7

Особняком стоят два регистра. Это уже знакомый нам «указатель команд» ip и регистр флагов f. В последнем устанавливаются (чаще всего самим процессором) ряд флагов. Большинство флагов характеризуют результат последней операции, выполненной процессором. Состояние флагов, например, анализируют команды условных переходов, то есть флаги используются для организации ветвлений в программах. Формат регистра f приведен на рис. 2.8. Новичок в Ассемблере, как правило, вначале сталкивается только с одним флагом. Это флаг «нулевого результата» z (zero). Однако для полноты картины мы здесь все же приведем описание всех флагов.

15..12

11

10

9

8

7

6

5

4

3

2

1

0

резерв

of

df

if

tf

sf

zf

-

af

-

pf

-

cf

Рис. 2.8

cf (carry) – флаг переноса. Этот флаг устанавливается в единицу, если в процессе операции возникает перенос из старшего разряда (или был заем в старший разряд при вычитании). С этим флагом работают некоторые команды условных переходов. Программист может непосредственно влиять на значение этого флага, используя команды stc, clc и cmc (установить, сбросить, инвертировать).

pf (parity)– флаг четности. Устанавливается в единицу, если в младшем байте результата получилось четное число единиц. Флаг можно использовать для организации «контроля по четности», с ним работают некоторые команды условных переходов.

af (adjust) – флаг межтетрадного переноса. Устанавливается в единицу, если в процессе операции возникает перенос из 3-го бита в 4-й (или был заем из 4-го бита при вычитании). С флагом работают команды коррекции для двоично-десятичной (BCD) арифметики.

zf (zero) – флаг нулевого результата. Устанавливается в единицу, если результат операции оказался равен нулю. С флагом работают некоторые команды условных переходов.

sf (sign)– флаг знака. Устанавливается в единицу, если в старшем разряде результата получилась единица, то есть результат является отрицательным числом. С флагом работают некоторые команды условных переходов.

tf (trap)– флаг трассировки. Если этот флаг установлен в единицу, программа выполняется в «пошаговом режиме», так как после каждой команды процессора автоматически генерирует прерывание типа 1. Таким образом, этот флаг используется для отладки. У программиста нет в распоряжении команд, влияющих на этот флаг. Поэтому изменить значение флага tf можно только косвенным образом, через стек.

if (interrupt enable)– флаг разрешения внешних прерываний. Если этот флаг установлен в ноль, процессор игнорирует запросы на прерывание, приходящие на вход INTR процессора, то есть запрещаются внешние прерывания (от клавиатуры, мыши и.т.д). Для работы с этим флагом есть две команды:

sti (set if) - if 1разрешить внешние прерывания;

cli (clear if) - if 0запретить внешние прерывания.

df (direction)– флаг направления, задает автоинкремент или автодекремент регистров si и di в строковых командах. Программист имеет возможность влиять на этот флаг с помощью команд std и cld.

of (overflow)– флаг переполнения. Устанавливается в единицу, если в результате выполнения арифметической операции произошло переполнение разрядной сетки. С флагом работает команда into – «прерывание, если установлен флаг of» и некоторые команды условных переходов.

В заключение этого раздела отметим, что современные процессоры имеют 32 разрядный формат регистров и эти регистры обозначаются eax, ecx, …., edi.