Магда Юрий
Шрифт:
Сегментные регистры (CS, DS, SS, ES, FS и GS) содержат 16-разрядные селекторы сегментов. Селектор представляет собой специальный указатель, который идентифицирует данный сегмент в памяти. Более подробно мы остановимся на использовании сегментных регистров в главе 4.
Рис. 3.7. Использование регистров общего назначения
Помимо регистров общего назначения и сегментных регистров, как мы знаем, в базовой архитектуре имеется еще два регистра: регистр управления/состояния EFLAGS и регистр-указатель адреса следующей инструкции El Р. Рассмотрим их более подробно.
Регистр EFLAFS, часто именуемый регистром флагов, имеет 32 разряда и содержит группу битов или, как их чаще называют, флагов состояния, управляющий флаг и группу системных флагов. На рис. 3.8 показана структура регистра флагов и приводится расшифровка наиболее часто используемых флагов.
Рис. З.8. Регистр управления/состояния процессора
Указанные на рис. 3.8 флаги наиболее часто используются в прикладных программах и сигнализируют о следующих событиях:
– OF (флаг переполнения) фиксирует ситуацию переполнения, то есть выход результата арифметической операции за пределы допустимого диапазона значений;
– DF (флаг направления) используется командами обработки строк. Если DF = 0, строка обрабатывается в прямом направлении, от меньших адресов к большим. Если DF = 1, обработка строк ведется в обратном направлении;
– SF (флаг знака) показывает знак результата операции, при отрицательном результате SF = 1;
– ZF (флаг нуля) устанавливается в 1, если результат операции равен 0;
– AF (флаг вспомогательного переноса) используется в операциях над упакованными двоично-десятичными числами. Этот флаг служит индикатором переноса или заема из старшей тетрады (бит 3);
– PF (флаг четности) устанавливается в 1, если результат операции содержит четное число двоичных единиц;
– CF (флаг переноса) показывает, был ли перенос или заем при выполнении арифметических операций.
Из всех этих флагов только флаг переноса CF может устанавливаться или сбрасываться непосредственно при помощи команд ассемблера stc, cl с и стс. Кроме того, в этот флаг может быть скопирован бит, определенный командами bt, bts, btr и btc.
Флаги состояния также используются при анализе операций, результатами которых являются беззнаковые целые числа, целые числа со знаком и упакованные (BCD) целые числа. Если результатом операции является беззнаковое целое число, то установка флага переноса CF в 1 (перенос или заем) свидетельствует о выходе за пределы допустимого диапазона. Если результатом операции является целое число со знаком (двоичное дополнение числа), то об этом свидетельствует установка в 1 флага переполнения OF.
В случае если результат операции интерпретируется как число в формате BCD, то установка флага AF свидетельствует о возникновении переноса или заема. Флаг SF указывает на знак результата, являющегося знаковым числом. Флаг ZF указывает на равенство нулю знакового или беззнакового числа.
При выполнении операций целочисленной арифметики с повышенной точностью флаг переноса CF используется командами adc (сложение с переносом) и sbb (вычитание с заемом) для того, чтобы учитывать перенос при переходе к следующей операции сложения или вычитания.
Флаги состояния используются командами условного перехода jCC (CC – код условия: eq, le, It, ne и т. д.), командами setСС, ТоорСС и cmovCC.
Флаги состояния процессора могут быть помещены в стек и извлечены из стека командами pushf, pushfd, popf, popfd. Кроме того, флаги могут быть загружены в старшую половину регистра АХ или извлечены из старшей половины при помощи команды lahf или sahf.
Перейдем к описанию регистра EIP – он содержит смещение в программном сегменте следующей выполняемой команды. Если в программе встречаются команды jCC, call, ret или iret, то содержимое регистра EIP может измениться произвольным образом – смещение следующей команды может быть как положительным, так и отрицательным. Содержимое регистра-указателя следующей команды не может быть изменено какой-либо инструкцией напрямую, хотя можно получить его содержимое, если выполнить команду call, а затем прочитать указатель на следующую команду, находящийся в стеке.
Регистр EIP можно модифицировать, опять-таки не прямо, а через стек, заменив адрес следующей команды. Естественно, перед этим следует выполнить команду call.
Прежде чем приступить к анализу команд ассемблера и способов обработки данных, нам необходимо рассмотреть модели памяти, с которыми может работать процессор. Модель памяти определяет способ организации программ и данных в памяти компьютера. В 32-разрядной архитектуре процессора Intel Pentium используются три модели памяти:
– плоская, или линейная, модель памяти (flat memory model) – память представляет собой непрерывное пространство адресов. Такое пространство адресов называется линейным. Программный код, данные, область стека располагаются в этом пространстве адресов. Адресное пространство в этой модели адресуется побайтно, а диапазон адресов равен 232. Схематично эта модель памяти показана на рис. 3.9;