adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
размер 4 байта (длинное целое), он заносится в стек, как два
Турбо Ассемблер 3.0/tasm/#2-2 = 126 =
16-битовых слова. В соответствии со стандартом процессоров серии
8088 наиболее значащее (старшее) слово заносится в стек первым и
занимает в стеке старшие адреса.
Вещественные значения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Параметры-значения вещественного типа (real) передаются, как
6 байт в стеке (в Турбо Паскале это тип представляет собой 6-бай-
товый программно-эмулируемый тип с плавающей точкой). Это единс-
твенный тип, превышающий 4 байта, который может передаваться че-
рез стек.
Типы Single, Double, Extended и Comp и типы сопроцессора 8087
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Турбо Паскаль использует те же соглашения о передаче пера-
метров для 8087, что и семейство компиляторов Borland C++. Пара-
метры передаются через главный стек центрального процессора,
вместе с остальными параметрами.
Указатели
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Значения параметров для всех типов указателей заносятся не-
посредственно в стек, как указатели дальнего типа: сначала слово,
содержащее сегмент, затем другое слово, содержащее смещение. Сег-
мент занимает старший адрес, в соответствии с соглашениями фирмы
Intel. Для извлечения параметра-указателя в программе Турбо Ас-
семблера можно использовать инструкции LDS или LES.
Строки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Строковые параметры, независимо от размера, обычно никогда
не заносятся в стек. Вместо этого Турбо Паскаль заносит в стек
указатель (дальнего типа) на строку. Вызываемая подпрограмма не
должна изменять строку, на которую ссылается указатель. Если это
необходимо, подпрограмма может создать и работать с копией стро-
ки.
Единственное исключение из этого правила - это случай, когда
подпрограмма в перекрываемом (оверлейном) модуле A передает как
параметр-значение строковую константу подпрограмме в перекрывае-
мом модуле B. В этом контексте перекрываемый модуль означает лю-
бой модуль, скомпилированный с директивой {$O+} (допускаются
оверлеи). В этом случае перед тем, как будет сделан вызов и адрес
стека будет передан программе в модуле B, в стеке для строковой
константы резервируется временная память.
Записи и массивы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Записи и массивы, занимающие ровно 1, 2 или 4 байта, дубли-
Турбо Ассемблер 3.0/tasm/#2-2 = 127 =
руются непосредственно в стек и передаются, как параметры-значе-
ния. Если массив или запись имеет какой-либо другой размер (вклю-
чая 3 байта), то в стек заносится указатель на этот массив или
запись. В этом случае, если подпрограмма модифицирует такую
структуру, то она должна создать ее локальную копию.
Множества
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Множества, как и строки, обычно никогда не заносятся непос-
редственно в стек. Вместо этого в стек заносится указатель на
множество. Первый бит младшего байта множества всегда соответс-
твует элементу базового типа (или порождающего типа) с порядковым
значением 0.
Единственное исключение из этого правила - это случай, когда
подпрограмма в перекрываемом (оверлейном) модуле A передает как
параметр-значение константу-множество подпрограмме в оверлейном
модуле B. В этом контексте перекрываемый модуль означает любой
модуль, компилированный с директивой {$O+} (допускаются оверлеи).
В этом случае перед тем, как будет сделан вызов и адрес стека бу-
дет передан программе в модуле B, в стеке для множества-константы
резервируется временная память.
Параметры-переменные
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Все параметры-переменные (var) передаются точно также: как
указатель дальнего типа на их действительные адреса в памяти.
Обеспечение стека
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Турбо Паскаль ожидает, что перед возвратом управления из
подпрограммы все параметры в стеке центрального процессора будут
удалены.
Есть два способа настройки стека. Вы можете использовать ин-
струкцию RET N (где N - это число байт передаваемых, то есть за-
несенных в стек, параметров), либо сохранить адрес возврата в ре-
гистрах (или в памяти) и извлечь параметры из стека поочередно.
Такую технику извлечения полезно использовать для оптимизации по
скорости при работе с процессором 8086 или 8088 (самые "медлен-
ные" процессоры серии), когда на адресацию типа "база плюс смеще-
ние" затрачивается минимум 8 циклов за обращение. Это позволяет
также сэкономить место, так как инструкция POP занимает только
один байт.
Примечание: Если вы используете директивы .MODEL, PROC
и ARG, то Ассемблер автоматически добавляет во все инструк-
ции RET число байт извлекаемых параметров.
Турбо Ассемблер 3.0/tasm/#2-2 = 128 =
Доступ к параметрам
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Когда получает управление ваша подпрограмма на Турбо Ассемб-
лере, вершина стека будет содержать адрес возврата (два или четы-
ре слова, в зависимости от того, является ли подпрограмма ближней
или дальней), а далее будут находится передаваемые параметры.
Примечание: При вычислении адресов параметров нужно
принимать во внимание регистры, такие как BP, содержимое
которых также может быть занесено в стек.)
Существует три основных метода доступа к параметрам, переда-
ваемых Турбо Паскалем вашей подпрограмме на Турбо Ассемблере. Вы
можете:
- использовать для адресации к стеку регистр BP;
- для получения параметров использовать другой базовый или
индексный регистр;
- извлечь из стека адрес возврата, а затем параметры.
Первый и второй методы более сложны, и мы расскажем о них в
следующих двух разделах. Третий метод предусматривает извлечение
из стека и сохранение адреса возврата, а затем извлечения пара-
метров и записи их в регистры. Лучше всего этот метод работает,
когда ваша подпрограмма не требует пространства для локальных пе-
ременных.
Использование для адресации к стеку регистра BP
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Первый и наиболее часто используемый метод доступа к пара-
метрам, передаваемым из Турбо Паскаля в Турбо Ассемблер, заключа-
ется в том, чтобы использовать для адресации к стеку регистр BP.
Например:
CODE SEGMENT
ASSUME CS:CODE
MyProc PROC FAR ; procedure MyProc(i,j : integer);
PUBLIC MyProc
j EQU WORD PTR [bp+6] ; j находится над сохраненным BP
; и адресом возврата
i EQU WORD PTR [bp+8] ; i располагается над j
push bp ; нужно сохранить BP вызывающей
; программы
mov bp,sp ; BP теперь указывает на вершину
; стека
mov ax,i ; адресуемся к i через BP
.
.
.
Турбо Ассемблер 3.0/tasm/#2-2 = 129 =
При вычислении смешений в стеке параметров, к которым мы об-
ращаемся таким образом, нужно помнить, что 2 байта используются
для сохраненного регистра BP.
Обратите внимание на использование в данном примере присваи-
ваний. Они позволяют сделать программу более понятной. У них есть
только один недостаток: поскольку для выполнения такого рода при-
сваиваний можно использовать только директиву EQU (а не =), в
данной исходном файле Турбо Ассемблера вы не сможете переопреде-
лить идентификаторы i и j. Один из способов обойти это заключает-
ся в том, чтобы использовать более описательные имена параметров,
чтобы они не повторялись, либо можно ассемблировать каждую подп-
рограмму Ассемблера отдельно.
Директива ARG
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Хотя можно обращаться к параметрам через регистр BP, Турбо
Ассемблер предусматривает альтернативу вычислению смещений в сте-
ке и выполнению текстовых присваиваний. Это директива ARG. При
использовании ее в процедуре директива ARG автоматически опреде-
ляет смещения параметров относительно регистра BP. Она вычисляет
также размер блока параметров и использует его в инструкции RET.
Поскольку идентификаторы, создаваемые по директиве ARG, определе-
ны только в соответствующей процедуре, в каждой процедуре или
функции вам не требуется использовать уникальные имена парамет-
ров.
|
adfun.ru
|
|
|
|