Токже в нем запросто может быть и исполняемый код, но это да-
леко не нормальная ситуация;
2
e s .
Дополнительный (
Extended!
сегмент данных. Использу-
ется в случае, если не хватило 64 Кб для размещения данных,
или если необходимо работать сразу с двумя сегментами (на-
пример, в тех же строковых командах);
И ss. Сегмент стека. Процессор имеет возможность органи-
зовать часть оперативной памяти в виде стека, и «правильная»
адресация к стеку возможна лишь через ss.
Особняком стоит регистр cs, отвечающий за сегмент кода.
«В лоб» его значение выставить нельзя, да и бессмысленно (его
непродуманное изменение приводит, как правило, к зависанию
машины из-за попадания на конвейер М П «левых» команд). О д -
нако повлиять на него можно — например, с помощью стека.
В принципе, ничто не запрещает, чтобы несколько сегмент-
ных регистров указывали на один и тот же сегмент. Более того,
часто так и делают.
Есть еще 2 спецрегистра, которые напрямую недоступны даже
для чтения. Это регистр
i p
(
Instruction pointer—
регистр, указываю-
щий, какой байт памяти должен загрузить процессор на выполне-
ние), и
f l a g s
— текущие флаги М П. На эти регистры тоже можно
влиять через стек, командами перехода, на
f l a g s
же влияет чуть
не каждая вторая команда. Все регистры также двухбайтные; фла-
ги (биты регистра
f l a g s )
интерпретируются следующим образом;
2
0
c f ,
Carry Flag.
Устанавливается в 1, если произошел пе-
ренос из старшего разряда;
2
1 не используется, установлен в 1 ;
2
2 P F —
Parity flag,
флаг четности. Устанавливается в
1 , ес-
ли младший байт результата содержит четное число единиц;
2
3 не используется, установлен в 0;
2
4 A F —
auxiliary carry,
применяется для операций с двоич-
но-десятичными числами;
2
5 н е и с п о л ь з у е т с я , у с т а н о в л е н в 0 ;
2
6
z f
zero flag,
устанавливается в 1, если операция име-
ет нулевой результат;
И 7
s f
-
sign flag,
флаг знака. Отображает состояние стар-
шего бита результата;
■/
8 t f —
trace flag,
флаг трассировки. Процессор переходит
в режим покомандного выполнения (прерывается после каждой
команды). Так работают многие отладчики;
2
9 i f
interruption flag,
флаг прерываний. Если установлен
в
1 , прерывание работы процессора аппаратурой разрешено;
2
A
DF
direction flag,
флаг направления. Используется в
строковых командах;
И
в o f —
overflow flag,
флаг переполнения. М П устанавлива-
ет его в
1
если результат не помещается в месте назначения
И
с,
D,
Е — не используются в режиме реальных адресов;
■И
F
— не используется, установлен в 0.
Для флагов
c f ,
i f
,
DF
существуют специальные команды, ус
танавливающие и сбрасывающие их. Мнемоника команд такова:
■И установка в 1 —
ST
[первая буква имени флага]
(STC
SeT CF)
У установка в 0 — C L [аналогично]
(c l c —
d e a r CF).
О с-
тальные флаги необходимо устанавливать вручную.
С регистрами вроде бы как разобрались. Если сейчас что-то
неясно с теми же флагами, ничего страшного — по мере прак-
тического использования все прояснится. Теперь — память.
В режиме реальных адресов используется
сегментная адре-
сация памяти.
Сегмент, как уже говорилось — участок памяти размером 64 Кб.
Исходя из размера сегментных регистров, можно сказать, что в
памяти существует 65 536 сегментов. Как же они размещены в
1
М б памяти? Очень просто — они перекрывают друг друга ка-
ждые 16 байт. Физический 20-разрядный (посчитайте, сколько па-
мяти так адресуется) адрес памяти формируется так: берется но-
мер сегмента, умножается на 16, и к нему прибавляется смеще-
ние. Например, нам надо обратиться к 32 767 байтам памяти.
Адрес в форме сегмент: смещение можно записать так:
0 0 0 0 : 3 2 7 6 7 (0 * 1 6 + 3 2 7 6 7 = 3 2 7 6 7 )
А можно и так:
0 0 0 1 : 3 2 7 5 1 ( 1 * 1 6 + 3 2 7 5 1 = 3 2 7 6 7 )
А в нормальной форме —
2 0 4 7 : 0 0 1 5
Вообще, процессоры серии х86 по праву считаются одними
из самых сложных как по реализации, так и по программирова-
нию. Для явной адресации к оперативной памяти с помощью ре-
гистров тут отведено целых 24 способа. Указателями могут быть
регистры вх, b p , sp, s i и d i . Например:
M O V
АХ, ВХ ; помещаем в АХ значение ВХ
M O V А Х , E S : [ В Х ]
; помещаем в
А Х
2 байта по адресу
E S : B X .
Ес-
ли
E S = 1 0
,
В Х = 2 0 0 0
, то этот адрес равен
1 0 * 1 6 + 2 0 0 0 = 2 1 6 0
.
Все регистры-указатели имеют сегментный регистр, относи-
тельно которого они адресуются «по умолчанию». Для вх и s i
это регистр
DX,
ДЛЯ
BP — SS,
Д ЛЯ
DI — ES.
То есть команды MOV
АХ, DS: [ВХ]
и MOV
ах
, [вх] будут эквивалентны. Использование
второго типа команд предпочтительно, так как команда занима-
ет меньше места и выполняется быстрее.
Адресоваться явным образом к оперативной памяти компью-
тера также можно с помощью всевозможных комбинаций выше-
перечисленных регистров и целых чисел. Допускается использо-
вание не более двух регистров одновременно. Но выйти за пре-
делы сегмента не получится — устройство, вычисляющее смеще-
ние, имеет разрядность в 16 бит.
Примеры:
[BP+SI]
[ B X + S I + 1 4 0 ]
[ В Х + 4 0 0 0 ]
и т.п.
Существует также куча способов адресоваться к памяти неяв-
но, без указания регистров. Но о них я расскажу в следующий раз.
С памятью вроде бы тоже более-менее понятно, по крайней
мере для начала. Конечно, есть еще интересный способ для
286 процессора получить дополнительные 64 Кб памяти выше
1
М б, но поскольку это скорее тема отдельной статьи, рассмат-
ривать его мы пока не будем.
Еще очень интересная вещь, особенно
для
тех, кто хочет ра-
ботать с аппаратурой, —
адресное пространство портов ввода-
вывода.
Это — часть адресного пространства ПК, размером в
64 Кб, к которому, грубо говоря, подключается своими интер-
фейсами оборудование. Каждый порт эквивалентен 1
байту, т.е.
содержит В бит. В Windows, когда вы просматриваете сведения
об устройствах, во вкладке
Ресурсы
зачастую присутствует па-
раметр
диапазон ввода-вывода.
Это и есть совокупность пор-
тов, используемых устройством. С вводом-выводом есть одна про-
блема: по сравнению с Ц П периферийные устройства, как пра-
вило, медленны. Поэтому при многократном вводе-выводе сле-
дует вставлять дополнительные команды ожидания
NOP.
Пары
команд, как правило, хватает даже на 2-ГГц Pentium 4.
Наиболее характерные диапазоны —
3F8h, 2F8h
(С О М 1 ,
CO M 2);
378h[
LPT1),
220h
(Sound Blaster),
42h~45h
(системный тай-
мер) и пр. Подробные описания портов приведены в многочис-
ленных книгах по архитектуре ПК Это — один из самых низких
уровней программирования. Большинство устройств имеют свою
собственную систему команд и программируются непосредствен-
но через соответствующие Ю-порты — как, например, контрол-
леры гибких/жестких дисков, видеоадаптеры. Т.е. программист ра-
ботает с машинным кодом специализированных процессоров. По
счастью, системы команд у них намного проще, чем у ЦП.
Таким образом, знания об Ю -портах пригодятся вам, если вы
соберетесь писать собственные драйверы устройств. К сожале-
нию, несмотря на массу книг по соответствующей тематике, мно-
гие вещи документированы весьма плохо, и поиск приходится
производить самостоятельно.
В следующей статье я планирую рассказать об основных ко-
мандах и директивах Ассемблера с тем, чтобы вы уже могли пи-
сать первые свои программы.
Если у вас возникли какие-то вопросы — пишите, я с радо-
стью отвечу.
Да, чуть не забыл самое главное.
. Литература. Конечно же, это
Assembler: учебник для вузов
и
Assembler специальный справочник
Виктора Юрова. С этих книг я собственно, начал — не учить, нет,
П О НИ М АТЬ Ассемблер. И именно благодаря им он стал одним
из моих любимых инструментов. Для тех же, кто захочет в большем
объеме изучить архитектуру IBM PC, рекомендую книгу нашего пре-
подавателя А. И. Поворознюка
Персональные компьютеры IBM:
Архитектура и управление,
которую можно взять с http://
khpi.narod.ru, или классику жанра —
Справочник программиста ПК
типа IBM PC,
XT
и А Т
Роберта Джордейна. В последнее время поя-
вилось, конечно, много интересных книг по этому вопросу, но они,
во-первых, стоят дорого, а во-вторых, довольно сложны в изучении.
(Продолжение следует)
предыдущая страница 40 Мой Компьютер 2004 39 читать онлайн следующая страница 42 Мой Компьютер 2004 39 читать онлайн Домой Выключить/включить текст