adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP ДД і Адрес возврата і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 2 і 25 (i) і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 4 і 4 (j) і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 6 і 1 і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
і і
. .
. .
. .
Рис. 18.2 Состояние стека перед выполнением первой инструк-
ции функции Test
Турбо Ассемблер 3.0/tasm/#2-2 = 95 =
Параметры функции Test представляют собой фиксированные ад-
реса относительно SP, начиная с ячейки, на два байта старше адре-
са, по которому хранится адрес возврата, занесенный туда при вы-
зове. После загрузки регистра BP значением SP вы можете обращать-
ся к параметрам относительно BP. Однако, вы должны сначала сохра-
нить BP, так как в вызывающей программе предполагается, что при
возврате BP изменен не будет. Занесение в стек BP изменяет все
смещения в стеке. На Рис. 18.3 показано состояние стека после вы-
полнения следующих строк кода:
.
.
.
push bp
mov bp,sp
.
.
.
. .
. .
. .
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP ДД і BP вызывающей прогр. і ДД BP
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 2 і Адрес возврата і BP + 2
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 4 і 25 (i) і BP + 4
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 6 і 4 (j) і BP + 6
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 8 і 1 і BP + 8
ГДДДДДДДДДДДДДДДДДДДДДДДґ
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
і і
. .
. .
. .
Рис. 18.3 Состояние стека после инструкций PUSH и MOVE
Организация передачи параметров функции через стек и исполь-
зование его для динамических локальных переменных - это стандарт-
ный прием в языке С++. Как можно заметить, неважно, сколько пара-
метров имеет программа на языке С++: самый левый параметр всегда
хранится в стеке по адресу, непосредственно следующим за сохра-
ненным в стеке адресом возврата, следующий возвращаемый параметр
хранится непосредственно после самого левого параметра и т.д.
Поскольку порядок и тип передаваемых параметров известны, их
всегда можно найти в стеке.
Турбо Ассемблер 3.0/tasm/#2-2 = 96 =
Пространство для динамических локальных переменных можно за-
резервировать, вычитая из SP требуемое число байт. Например,
пространство для динамического локального массива размером в 100
байт можно зарезервировать, если начать функцию Test с инструк-
ций:
.
.
.
push bp
mov bp,sp
sub sp,100
.
.
.
как показано на Рис. 18.4
Турбо Ассемблер 3.0/tasm/#2-2 = 97 =
. .
. .
. .
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP ДД і і Д BP - 100
ГДДДДДДДДДДДДДДДДДДДДДДДґ
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
. .
. .
. .
. .
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 100 ДД і BP вызывающей прогр. і ДД BP
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 102 і Адрес возврата і BP + 2
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 104 і 25 (i) і BP + 4
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 106 і 4 (j) і BP + 6
ГДДДДДДДДДДДДДДДДДДДДДДДґ
SP + 108 і 1 і BP + 8
ГДДДДДДДДДДДДДДДДДДДДДДДґ
і і
ГДДДДДДДДДДДДДДДДДДДДДДДґ
і і
. .
. .
. .
Рис. 18.4 Состояние стека после инструкций PUSH, MOVE и SUB
Поскольку та часть стека, где хранятся динамические локаль-
ные переменные, представляет собой более младшие адреса, чем BP,
для обращения к динамическим локальным переменным используется
отрицательное смещение. Например, инструкция:
mov byte ptr [bp-100]
даст значение первого байта ранее зарезервированного 100-байтово-
го массива. При передаче параметров всегда используется положи-
тельная адресация относительно регистра BP.
Хотя можно выделять пространство для динамических локальных
переменных описанным выше способом, в Турбо Ассемблере предусмот-
рена специальная версия директивы LOCAL, которая существенно уп-
рощает выделение памяти и присваивание имен для динамических ло-
кальных переменных. Когда в процедуре встречается директива
LOCAL, то подразумевается, что она определяет для данной процеду-
ры динамические локальные переменные. Например, директива:
Турбо Ассемблер 3.0/tasm/#2-2 = 98 =
LOCAL LocalArray:BYTE:100,LocalCount:WORD=AUTO_SIZE
определяет динамические переменные LocalArray и LocalCount.
LocalArray на самом деле представляет собой метку, приравненную к
[BP-100], а LocalCount - это метка, приравненная к [BP-102]. Од-
нако вы можете использовать их, как имена переменных. При этом
вам даже не нужно будет знать их значения. AUTO_SIZE - это общее
число байт (объем памяти), необходимых для хранения динамических
локальных переменных. Чтобы выделить пространство для динамичес-
ких локальных переменных, это значение нужно вычесть из SP.
Приведем пример того, как нужно использовать директиву
LOCAL:
.
.
.
_TestSub PROC
LOCAL
LocalArray:BYTE:100,LocalCount:WORD=AUTO_SIZE
push bp ; сохранить указатель стека
; вызывающей программы
mov bp,sp ; установить собственный
; указатель стека
sub sp,AUTO_SIZE ; выделить пространство для
; динамических локальных
; переменных
mov [LocalCount],10 ; установить переменную
; LocalCount в значение 10
; (LocalCount это [BP-102])
.
.
.
mov cx,[LocalCount] ; получить значение
; (счетчик) из локальной
; переменной
mov al,'A' ; заполним символом 'A'
lea bx,[LocalArray] ; ссылка на локальный
; массив LocalArray
; (LocalArray это [BP-100])
FillLoop:
|
adfun.ru
|
|
|
|