| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
mov si,201h
mov dl,[si]
.
.
.
Здесь для сегментного регистра DS устанавливается значение
1000h, SI устанавливается в значение 201h. Мы можем представить
их в виде 4сегмент:смещение" - 1000:201h. (Эффективные вычисления
для пары "сегмент:смещение" могут выполняться только по основа-
нию 16. Это еще одна причина необходимости познакомиться с шест-
надцатиричной арифметикой.) Адрес в DL, из которого загружается
адрес, представляет собой:
((DS * 16) + SI) или ((1000h * 16) + 201h)
1000h
Х 16
------
10000h
Этот пример иллюстрируется на Рис. 4.8.
--------------------------- ----------------
DS | 1000h | SI | 201h |
--------------------------- ----------------
| |
V |
-------------------- |
( умножение на 16 ) |
( /сдвиг влево на 4/ ) |
-------------------- |
| |
V |
---------------------- |
| 10000h | |
---------------------- |
| |
| ----- |
---------->( + )<-------------
-----
|
V
-----------------------
Адрес памяти | 10201h |
-----------------------
Рис. 4.8 Вычисление адреса памяти с помощью инструкции mov.
С другой стороны это можно рассматривать просто как сдвиг
значения сегмента на 4 бита, или одну шестнадцатиричную цифру,
что эквивалентно умножению на 16:
1000
+ 201
-----
10201
Теперь вы можете видеть, что программа получает доступ к
полному адресному пространству в 1 мегабайт с помощью использова-
ния только пары "сегмент:смещение". Фактически, для доступа к па-
мяти вы всегда должны использовать пару "сегмент:смещение". Все
инструкции и режимы адресации процессора 8086 по умолчанию рабо-
тают относительно того или иного сегментного регистра, хотя в не-
которых инструкциях можно явно указать, что нужно использовать
желаемый сегментный регистр.
Вам редко потребуется загружать значение непосредственно в
сегментный регистр. Вместо этого вы будете загружать в сегментные
регистры имена сегментов, которые в ходе ассемблирования, компо-
новки и выполнения превращаются в числа. Это необходимо, посколь-
ку нет способа сказать заранее, где в памяти будет находиться
данный сегмент: это зависит от версии DOS, числа и размера рези-
дентных в памяти программ, а также потребности в памяти остальной
части программы. Использование имен сегментов позволяет Турбо Ас-
семблеру и операционной системе DOS выполнять подобные вычисле-
ния.
Наиболее общим именем сегмента является @Date, которое в уп-
рощенных директивах определения сегментов используется для ссылки
на используемый по умолчанию сегмент данных. Например:
DOSSEG
.MODEL SMALL
.DATA
var1 DW 0
.
.
.
.CODE
mov ax,@data
mov ds,ax
.
.
.
END
Здесь регистр DS загружается таким образом, что он будет
указывать на используемый по умолчанию сегмент данных, в котором
находится Var1.
Здесь мы опять забежали вперед: упрощенные директивы опреде-
ления сегментов и загрузку сегментных регистров мы обсудим в сле-
дующей главе.
Использование сегментов процессора 8086 приводит к некоторым
интересным моментам. Один из них состоит в том, что только блок
памяти размером в 64К в любой момент может адресоваться через
сегментный регистр, так как 64К - это максимальный объем памяти,
к которой можно адресоваться с помощью 16-битового смещения. Это
может оказаться неприятным при работе с большим (более 64К) объ-
емом памяти, так как и значение сегментного регистра, и смещение,
придется часто изменять.
Адресация к большим блокам памяти в процессоре 8086 может
представлять еще большую трудность, поскольку, в отличие от ре-
гистров общего назначения (общих регистров), сегментные регистры
не могут использоваться в качестве источников или приемников в
арифметических и логических инструкциях. Фактически, единственная
операция, которую можно выполнять с сегментными регистрами, сос-
тоит в копировании значений между сегментными регистрами и други-
ми общими регистрами или памятью. Например, чтобы добавить значе-
ние 100 к регистру ES, потребуется следующее:
.
.
.
mov ax,es
add ax,100
mov es,ax
.
.
.
Из всего этого можно сделать заключение, что процессор 8086
лучше подходит для работы с памятью в блоках, не превышающих 64К.
Второй момент использования сегментов состоит в том, что
каждая ячейка памяти адресуется через многие возможные сочетания
"сегмент:смещение". Например, адрес памяти 100h адресуется с по-
мощью следующих значений "сегмент:смещение": 0:100h, 1:F0h, 2:E0h
и т.д., так как при вычислении всех этих пар "сегмент:смещение"
получается значение адреса 100h.
Аналогично регистрам общего назначения каждый сегментный ре-
гистр играет свою, конкретную роль. Регистр CS указывает на код
программы, DS указывает на данные, SS - на стек, сегмент (сегмен-
тный регистр) ES - это "трафаретный" (дополнительный) сегмент,
который может использоваться так, как это необходимо. Рассмотрим
сегментные регистры более подробно.
Регистр CS
-----------------------------------------------------------------
Регистр CS указывает на начало блока памяти объемом 64К, или
сегмент кода, в котором находится следующая выполняемая инструк-
ция. Следующая инструкция, которую нужно выполнить, находится по
смещению, определяемому в сегменте кода регистром IP, то есть на
нее указывает адрес (в форме "сегмент:смещение") CS:IP. Процессор
8086 никогда не может извлечь инструкцию из сегмента, отличного
от того, который определяется регистром CS.
Регистр CS можно изменять с помощью многих инструкций, вклю-
чая отдельные инструкции перехода, вызовы и возвраты управления.
Ни при каких обстоятельствах регистр CS нельзя загрузить непос-
редственно.
Никакие другие режимы адресации или указатели памяти, отлич-
ные от IP, не могут нормально работать относительно регистра CS.
Регистр DS
-----------------------------------------------------------------
Регистр DS указывает на начало сегмента данных, которые
представляет собой блок памяти объемом 64К, в котором находится
большинство размещенных в памяти операндов. Обычно для ссылки на
адреса памяти используются смещения, предполагающие использование
регистров BX, SI или DI. В основном сегмент данных представляет
собой то, о чем говорит его название: как правило это сегмент, в
котором находится текущий набор данных. Адресация памяти обсужда-
ется далее, в Главе 5 "Основные элементы программы на языке Ас-
семблера".
Регистр ES
-----------------------------------------------------------------
Регистр ES указывает на начало блока памяти объемом 64К, ко-
торый называется дополнительным сегментом. Как и подразумевает
его название, дополнительный сегмент не служит для какой-то конк-
ретной цели, но доступен тогда, когда в нем возникает необходи-
мость. Иногда дополнительный сегмент используется для выделения
дополнительного блока памяти объемом 64К для данных. Однако дос-
туп к памяти в дополнительном сегменте менее эффективен, чем дос-
туп к памяти в сегменте данных (см. Главу 10 "Развитое программи-
рование на Турбо Ассемблере").
Особенно полезен дополнительный сегмент, когда используются
|
adfun.ru
|
|
|
|