Ассемблер в примерах и задачах [Наталья Юрьевна Добровольская] (pdf) читать постранично, страница - 4

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

регистрах CS и DS для обращения
к другому сегменту. Существовали так называемые «ближние» и
«дальние» переходы. Если команда, на которую надо совершить
переход, находилась в том же сегменте, то для перехода
достаточно было изменить только значение регистра IP. Такой
переход назывался ближним. Если же команда, на которую надо
совершить переход, находилась в другом сегменте, то для
перехода необходимо было изменить как значение регистра CS, так
и значение регистра IP. Такой переход назывался дальним и
осуществлялся дольше.
32-битные регистры позволяют адресовать 4 Гб памяти, что
уже достаточно для любой программы. Каждую Win32-программу
Windows запускает в отдельном виртуальном пространстве. Это
означает, что каждая Win32-программа будет иметь
4-гигабайтовое адресное пространство, но вовсе не означает, что
каждая программа имеет 4 Гб физической памяти, а только то, что
программа может обращаться по любому адресу в этих пределах.
А Windows сделает все необходимое, чтобы память, к которой
программа обращается, «существовала».
Под архитектурой Win32 отпала необходимость в разделении
адреса на базу и смещение и необходимость в моделях памяти. На
32-битной архитектуре существует только одна модель памяти —
14

Регистры процессоров семейства IA-32

flat (сплошная или плоская). Сегментные регистры остались, но
используются по-другому.
2.1.2. Регистр командного указателя EIP
Регистр указателя команд EIP1 содержит смещение на
команду, которая должна быть выполнена следующей.
EIP d

CS →

Сегмент команд

d
IP →

Текущая команда

2.1.3. Регистр флагов
Флаг — это бит, принимающий значение 1 («флаг
установлен»), если выполнено некоторое условие, и значение 0
(«флаг сброшен») в противном случае. Процессор имеет регистр
флагов, содержащий набор флагов, отражающий текущее
состояние процессора.
31

22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
I
V V
Зарезервированы I
A V R
N O
O D I T S Z
A
P
C
I I
0
0
0
1
C MF
F
F
F
(установлены в 0) D
T P
F F F F F F
P P
L
FLAGS



Флаг

Название

Описание

Тип флага

FLAGS
0

CF

1

1

1

Carry Flag

Флаг переноса
Зарезервирован

Instruction pointer – указатель команд.
15

Состояние

Ассемблер в примерах и задачах



Флаг

Название

Описание

Parity Flag Флаг чётности

Тип флага
Состояние

2

PF

3

0

4

AF

5

0

6

ZF

Zero Flag

Флаг нуля

Состояние

7

SF

Sign Flag

Флаг знака

Состояние

8

TF

Trap Flag

Флаг трассировки

Системный

9

IF

10

DF

11

OF

12
13

IOPL

14

NT

15

0

Зарезервирован
Auxiliary
Carry Flag

Вспомогательный
флаг переноса

Состояние

Зарезервирован

Interrupt
Флаг разрешения
Enable Flag прерываний
Direction
Флаг направления
Flag
Overflow
Флаг переполнения
Flag
I/O
Уровень приоритета
Privilege
ввода-вывода
Level
Nested Task Флаг вложенности
задач

Системный
Управляющий
Состояние
Системный
Системный

Зарезервирован

EFLAGS
16

RF

Resume Flag Флаг возобновления

Системный

17

VM

Virtual8086 Mode

Режим виртуального
процессора 8086

Системный

18

AC

Alignment
Check

Проверка
выравнивания

Системный

VIF

Virtual
Interrupt
Flag

Виртуальный флаг
разрешения
прерываний

Системный

VIP

Virtual
Interrupt
Pending

Ожидающее
виртуальное
прерывание

Системный

19

20

16

Регистры процессоров семейства IA-32


21

Флаг
ID

Название
ID Flag

Описание
Проверка на
доступность
инструкции CPUID

Тип флага
Системный

22
...
31

Зарезервированы

Значение флагов CF, DF и IF можно изменять напрямую в
регистре флагов с помощью специальных инструкций (например,
CLD для сброса флага направления), но нет инструкций, которые
позволяют обратиться к регистру флагов как к обычному регистру.
Однако можно сохранять регистр флагов в стек или регистр AH и
восстанавливать регистр флагов из них с помощью инструкций
LAHF, SAHF, PUSHF, PUSHFD, POPF и POPFD.
Флаги состояния (биты 0, 2, 4, 6, 7 и 11) отражают результат
выполнения арифметических инструкций, таких как ADD, SUB,
MUL, DIV.
− Флаг переноса CF устанавливается при переносе из
старшего значащего бита / заёма в старший значащий бит и
показывает наличие переполнения в беззнаковой целочисленной
арифметике. Также используется в длинной арифметике;
− Флаг чётности PF устанавливается, если младший
значащий байт результата содержит чётное число единичных
битов. Изначально этот флаг был ориентирован на использование
в коммуникационных программах: при передаче данных по
линиям связи для контроля мог также передаваться бит чётности и
инструкции для проверки флага чётности облегчали проверку
целостности данных;
− Вспомогательный флаг переноса AF устанавливается при
переносе из