adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
. .
. .
. .
Вначале: | |
--------------- |----------------|
AX | ? | 996 | ? |
--------------- | |
--------------- |----------------|
BX | ? | 998 | ? |
--------------- | |
--------------- |----------------|
SP | 1000 |-----------------> 1000 | ? |
--------------- | |
|----------------|
. .
. .
. .
. .
После mov ax,1 / push ax: | |
--------------- |----------------|
AX | 1 | 996 | ? |
--------------- | |
--------------- |----------------|
BX | ? | ---------> 998 | 1 |
--------------- | | |
--------------- | |----------------|
SP | 998 |--------- 1000 | ? |
--------------- | |
|----------------|
. .
. .
. .
. .
После mov bx,2 / push bx: | |
--------------- |----------------|
AX | 1 | ---------> 996 | 2 |
--------------- | | |
--------------- | |----------------|
BX | 2 | | 998 | 1 |
--------------- | | |
--------------- | |----------------|
SP | 996 |--------- 1000 | ? |
--------------- | |
|----------------|
. .
. .
. .
После pop ax: | |
--------------- |----------------|
AX | 2 | 996 | ? |
--------------- | |
--------------- |----------------|
BX | 2 | ---------> 998 | 1 |
--------------- | | |
--------------- | |----------------|
SP | 998 |--------- 1000 | ? |
--------------- | |
|----------------|
. .
. .
. .
. .
После pop bx: | |
--------------- |----------------|
AX | 2 | 996 | ? |
--------------- | |
--------------- |----------------|
BX | 1 | 998 | 1 |
--------------- | |
--------------- |----------------|
SP | 1000 |-----------------> 1000 | ? |
--------------- | |
|----------------|
. .
Рис. 4.6 Регистры AX, BX, SP и стек.
Хотя процессор 8086 и позволяет записывать значения в SP или
складывать и вычитать хранящиеся в регистре SP значения (как это
можно делать с обычными регистрами общего назначения), вам не
следует к этому прибегать, если вы не делаете этого преднамерен-
но. Если вы изменяете SP, то изменяется расположение вершины сте-
ка, что быстро может привести к неприятностям.
Почему? Ведь занесение в стек и извлечение из него не явля-
ется единственным способом использования стека. Стек используется
всякий раз, когда вы вызываете или возвращаетесь из подпрограммы
(процедуры или функции). Кроме того, стек используют некоторые
системные ресурсы (такие, как клавиатура или системный таймер),
когда они прерывают процессор 8086, чтобы выполнить свои функции.
Все это означает, что стек может в любой момент потребоваться.
Если вы измените SP, даже на несколько инструкций, то правильное
значение стека может оказаться недоступным, когда он потребуется
системным ресурсам.
Короче говоря, оставьте SP в покое, если только вам не тре-
буется изменить его специально. Можно свободно выполнять операции
занесения в стек и извлечения из него, вызовы и возвраты управле-
ния, но не изменяйте значения регистра SP непосредственно. Любой
из других семи регистров общего назначения можно спокойно изме-
нять в любой момент.
Указатель инструкций
-----------------------------------------------------------------
Указатель инструкций (регистр IP) всегда содержит смещение в
памяти, по которому хранится следующая выполняемая инструкция.
Когда выполняется одна инструкция, указатель инструкций перемеща-
ется таким образом, чтобы указывать на адрес памяти, где хранится
следующая инструкция. Обычно следующей выполняемой инструкцией
является инструкция, хранимая по следующему адресу памяти, но не-
которые инструкции, такие, как вызовы или переходы, могут привес-
ти к тому, что в указатель инструкций будет загружено новое зна-
чение. Таким образом, будет выполнен переход на другой участок
программы.
Значение счетчика инструкций нельзя прочитать или записать
непосредственно. Загрузить в указатель инструкций новое значение
может только специальная инструкция перехода (аналогичная только
что описанным).
Указатель инструкций сам по себе не определяет адрес, по ко-
торому находится следующая выполняемая инструкция. Картину здесь
опять усложняет сегментная организация памяти процессора 8086.
Для извлечения инструкции предусмотрен регистр CS, где хранится
базовый адрес, при этом указатель инструкций задает смещение от-
носительно этого базового адреса.
Каждый раз, когда мы говорим об адресации памяти, нам прихо-
дится упоминать сегменты. И каждый раз мы откладываем на потом
полное объяснение данного вопроса. Теперь пришло время этим за-
няться.
Сегментные регистры
-----------------------------------------------------------------
Теперь мы подошли к наиболее необычному аспекту процессора
8086 - сегментации памяти. Основной предпосылкой сегментации яв-
ляется следующее: процессор 8086 может адресоваться к 1 мегабайту
памяти. Для адресации ко всем ячейкам адресного пространства в 1
мегабайт необходимы 20-разрядные сегментные регистры. Однако про-
цессор 8086 использует только 16-разрядные указатели на ячейки
памяти. Вспомним, например, что для ссылки на память используется
16-разрядный регистр BX. Как же тогда согласовать 16-разрядные
указатели процессора 8086 и 20-разрядные адреса?
Ответ состоит в том, что процессор 8086 использует двухсту-
пенчатую схему адресации. Да, используются 16-разрядные указате-
ли, но эта форма представляет собой только часть полной схемы ад-
ресации. Каждый 16-разрядный указатель памяти или смещение комби-
нируется с содержимым 16-разрядного сегментного регистра для фор-
мирования 20-разрядного адреса памяти.
Сегменты и смещения комбинируются следующим образом: значе-
ние сегмента сдвигается влево на 4 (то есть умножается на 16), а
затем складывается со смещением, как показано на Рис. 4.7.
--------------------------- ----------------
| 16-разрядный сегментный | | 16-разрядное |
| регистр | | смещение |
--------------------------- ----------------
| |
V |
-------------------- |
( умножение на 16 ) |
( /сдвиг влево на 4/ ) |
-------------------- |
| |
V |
---------------------- |
| Значение сегмента, | |
| умноженное на 16, | |
| равно 20-разрядно- | |
| му значению | |
---------------------- |
| |
| ----- |
---------->( + )<-------------
-----
|
V
---------------------------------------
| 20-разрядное значение адреса памяти |
---------------------------------------
Рис. 4.7 20-разрядные адреса памяти.
Рассмотрим, например, следующий фрагмент программы:
.
.
.
mov ax,1000h
mov ds,ax
|
adfun.ru
|
|
|
|