Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Assembler / P03

.pdf
Скачиваний:
56
Добавлен:
02.06.2015
Размер:
456.21 Кб
Скачать

3) Указатель команд — Instruction Pointer (иногда его называют программным счетчиком — Program Counter— PC). Содержит смещение (offset) инструкции, подлежащей выполнению.

15

0

IP

Рис. 3.8.

4) Регистр флагов (Flags).

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

 

 

 

OF

DF

IF

TF

SF

ZF

 

AF

 

PF

 

CF

 

 

 

 

 

 

 

Рис. 3.9.

 

 

 

 

 

 

 

Флагами здесь называются отдельные биты. Каждый из них характеризует некоторое состояние или режим. Если бит содержит единицу ("установлен") — значит, состояние или режим, за которые отвечает этот бит имеют место (ДА). Если бит содержит нуль ("сброшен") — НЕТ.

Флаги делятся на три группы: флаги состояния — CF, PF, AF, ZF, SF, OF — отображают некоторые характеристики результата выполнения команды (они устанавливаются или сбрасываются центральным процессором); системные флаги — TF, IF и флаг управления DF — задают режимы работы ЦП и явно устанавливаются специальными командами.

Опишем назначение флагов состояния.

CF — carry flag — флаг переноса. При сложении сюда попадает бит переноса из знакового разряда. CF изменяется и по результатам некоторых других команд.

PF — parity flag — флаг четности. Установлен, если младший байт результата содержит четное число единиц. Используется для тестирования памяти.

AF — auxiliary flag — флаг вспомогательного переноса. Равен значению бита переноса из младшей тетрады в старшую в младшем байте (т.е. перенос из 3- го в 4-й бит). Используется при работе с двоично-десятичными числами, о которых речь пойдет позже.

ZF — zero flag — флаг нуля. Установлен, если результат нулевой; сброшен, если результат ненулевой.

SF — sign flag — флаг знака. Равен знаковому биту результата. Стало быть, установлен если результат отрицательный; сброшен, если неотрицательный.

OF — overflow flag — флаг знакового переполнения. Установлен, если результат арифметической операции над знаковыми операндами лежит вне допустимого диапазона.

Пример. AX = 2345h, BX = 3219h. Вычислим содержимое битов состояния регистра флагов после выполнения операции add ax,bx (к содержимому регистра AX прибавить содержимое BX и поместить результат в AX, т.е. AX = AX

+ BX).

Ясно, что 2345h + 3219h = 555Eh. Выполним эту же операцию в двоичной системе счисления (рис. 3.10):

0010 0011 0100 0101

+

0011 0010 0001 1001

0101 0101 0101 1110

Рис. 3.10.

CF = 0 (переноса из знакового разряда не было, точнее, перенос нулевой); PF = 0 (количество единиц в младшем байте равно 5, нечетному числу); AF = 0 (из третьего в четвертый бит переноса не было);

ZF = 0 (результат ненулевой);

SF = 0 (результат неотрицательный);

OF = 0 (сумма знаковых чисел в допустимом диапазоне).

Упражнение. Проделать то же самое, если AX = 5439h, BX = 456Ah. (Проверить решение вы сможете после изучения возможностей Turbo Debugger.)

Чисто формально перечислим назначение оставшихся трех флагов:

TF — trace flag — флаг трассировки (пошаговое выполнение команд с целью отладки программы),

IF — interrupt flag — флаг разрешения прерывания от внешнего устройства, DF — direction flag — флаг направления (в каком направлении — от младших адресов к старшим или наоборот — обрабатывают массив данных специ-

альные строковые команды).

Флаг TF используется отладчиками — это очень специальная тема, и разбирать ее мы не будем. Назначение флагов IF и DF детально будет разъяснено существенно позже.

Итак, программно-доступными являются 14 регистров. Однако сегментные регистры, а также IP, SP, регистр флагов содержат информацию, которой программист не может произвольно распоряжаться. Если ассемблерная программа стыкуется с программой, написанной на языке высокого уровня, то, как правило, задействован и регистр BP. Итак, для промежуточного хранения информации у программиста остается всего шесть, в лучшем случае, семь регистров (AX,BX,CX,DX,SI,DI и BP). Поэтому приходится прилагать немало усилий, чтобы снизить количество обращений к памяти.

3.13. Turbo Debugger. Знакомство с окном CPU.

Если вы еще не покинули Turbo Debugger, то нажатием клавиши F6 (Next, переход к следующему окну) вы перейдете в окно CPU. Это окно разбито на панели (рис. 3.11).

код

регистры

флаги

 

 

 

данные

стек

 

 

 

 

Рис.3.11.

Активной является панель кода (в ней находится синяя полоса курсора). Переход из панели в панель по часовой стрелке осуществляется нажатием клавиши Tab, против часовой стрелки — Shift+Tab (активизировать панель также можно щелчком мыши). С каждой панелью связано свое локальное меню, оно вызывается нажатием Alt+F10 или щелчком правой кнопки мыши.

Изучим панели регистров. Перейдите в панель регистров (Tab). Выделите курсором регистр DX, в котором сейчас записан 0 (отладчик заранее очищает регистры общего назанчения). Вызовите локальное меню (Alt+F10). Выделите в нем команду Decrement. В нижней строке экрана появляется подсказка: Decrement the highlighted register (уменьшение выделенного регистра). Если вы нажмете функциональную клавишу F1 (Help), то на экране появится окно с текстом Справки. Это окно закрывается нажатием клавиши Esc. Нажмите Enter. Содержимое DX изменится и станет равным FFFF. Увеличим его на 1. Вспомним, что начальные буквы пунктов локального меню были выделены цветом. Это означает, что, находясь в панели, можно осуществить команду локального меню нажатием комбинации клавиш Ctrl+буква. Нажмем (и не отпускаем) клавишу Ctrl. В нижней строке экрана появляется подсказка: Ctrl: I-Increment D- Decrement и т.д. Не отпуская Ctrl, нажмем клавишу I. Содержимое DX увеличится на 1 и вновь станет равным нулю. В локальном меню после пункта Change (изменить) стоит многоточие. Это означает, что после выбора этого пункта меню появится диалоговое окно. Запишите в CX число 7.

Проверим, правильно ли мы вычислили флаги для результата суммирования слов 2345h и 3219h. Введите эти значения в регистры AX и BX. Перейдите в панель кода и наберите команду add ax,bx. Как только вы введете букву a, как появится диалоговое окно Enter instruction to assemble (введите инструкцию для ассемблирования), в котором вы завершите ввод команды. В панели кода вы

увидите:

 

cs:0100►03C3

add ax,bx

Здесь 03C3 — это код команды add ax,bx. Именно такие числовые коды «понимает» процессор. Команда введена по адресу cs:100, т.е. сегментная часть адреса хранится в CS, а смещение равно 100. Треугольник показывает, что в IP хранится адрес 100. Тем самым команда готова к выполнению.

Нажмем клавишу F7 (trace — трассировка). В AX появится результат сложения 555E. В панели флагов увидим выставленные по результату сложения флаги.

Испытаем теперь следующую пару слагаемых: AX = 5439h, BX = 456Ah. Введите эти числа в регистры. А теперь еще раз выполним команду сложения. Для этого надо поместить в счетчик команд IP значение 100. Можно ввести это значение в панели регистров, но лучше поступить иначе. В панели кода поставим курсор на адрес 100 и выберем в локальном меню команду New CS:IP. В IP окажется нужное значение. Выполните команду F7 и проверьте результат.

Соседние файлы в папке Assembler