| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
end.
Процедура AsmProc вызывает процедуры PublicProc, NearProc
или FarProc, используя директиву EXTRN следующим образом:
DATA SEGMENT WORD PUBLIC
ASSUME DS:DATA
EXTRN A:WORD ; переменная из модуля
DATA ENDS
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE
EXTRN PublicProc : FAR ; дальняя процедура
; (экспортируется модулем)
EXTRN NearProc : NEAR ; ближняя процедура
; (локальная для модуля)
EXTRN FarProc : FAR ; дальняя процедура
; (локальна, но задана,
; как дальняя)
AsmProc PROC NEAR
PUBLIC AsmProc
CALL FAR PTR PublicProc
CALL NearProc
CALL FAR PTR FarProc
Турбо Ассемблер 3.0/tasm/#2-2 = 122 =
mov cx,ds:A ; взять переменную из
; модуля
sub cx,2 ; изменить ее
mov ds:A,cx ; записать ее обратно
RET
AsmProc ENDP
CODE ENDS
END
Основная программа, которая проверяет эту программу на Ас-
семблере и модуль Паскаля, выглядит следующим образом:
program TSample;
uses Sample;
begin
TestSample;
end.
Чтобы сформировать пример программы с помощью компилятора,
работающего в режиме командной строки, и Ассемблера, используйте
следующие команды (или командный файл):
TASM ASMPROC
TPC /B SAMPLE
TSAMPLE
Так как внешняя подпрограмма должна объявляться в программе
Турбо Паскаля на самом внешнем уровне процедур, вы не можете для
доступа к объектам, являющимся локальными по отношению к процеду-
рам или функциям использовать описания EXTRN. Однако, ваша прог-
рамма на Турбо Ассемблере при вызове из программы Турбо Паскаля
может получить эти объекты, как значения параметров-переменных.
Ограничения при использовании объектов типа EXTRN
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Синтаксис уточненного идентификатора Турбо Паскаля, при ко-
тором для доступа к объекту в заданном модуле используется имя
модуля и точка, несовместим с синтаксическими правилами Турбо Ас-
семблера и будет, таким образом, отвергнут. Описание:
EXTRN SYSTEM.Assing : FAR
приведет к тому, что Турбо Ассемблер выдаст сообщение об ошибке.
Имеется также два других ограничения на использование в Тур-
бо Паскале объектов EXTRN. Первое из них состоит в том, что в
ссылках на процедуру или функцию не могут выполняться арифмети-
ческие операции с адресами. Таким образом, если вы объявите:
EXTRN PublicProc : FAR
то не сможете записать оператор вида:
Турбо Ассемблер 3.0/tasm/#2-2 = 123 =
call PublicProc + 42
Второе ограничение относится к тому, что компоновщик Турбо
Паскаля не будет распознавать операции, которые разделяют слова
на байты, поэтому вы не можете применять такие операции к объек-
там EXTRN. Например, если вы объявите:
EXTRN i : WORD
то не сможете использовать в модуле Турбо Ассемблера выражения
LOW i или HIGH i.
Использование корректировок сегментов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Турбо Паскаль генерирует файлы .EXE, которые могут загру-
жаться в память компьютера РС по любому доступному адресу. Пос-
кольку в программе заранее неизвестно, куда будет загружен данный
сегмент программы, компоновщик указывает загрузчику DOS.EXE, что
нужно при загрузке скорректировать в программе все ссылки на сег-
менты. После выполнения этих корректировок все ссылки на сегменты
(такие, как CODE или DATA) будут содержать корректные значения.
Ваша программа на Турбо Ассемблере может использовать это
средство для получения адресов объектов во время выполнения.
Предположим, например, что в вашей программе требуется изменить
значение регистра DS, но вы не хотите сохранять в цикле исходное
содержимое стека или перемещать эти значения во временную об-
ласть. Вместо этого вы можете использовать операцию Турбо Ассем-
блера SEG:
.
.
.
mov ax,SEG DATA ; получить фактический
; адрес глобального значения
; DS Турбо Паскаля
mov ds,ax ; поместить его в DS для
; использования Турбо
; Паскалем
.
.
.
Когда ваша программа будет загружаться, DOS поместит коррек-
тное значение SEG DATA прямо в поле промежуточного операнда инст-
рукции MOV. Это наиболее быстрый путь перезагрузки сегментного
регистра.
Данный метод нужно также использовать, чтобы программы обс-
луживания прерываний сохраняли информацию в глобальном сегменте
данных Турбо Паскаля. Регистр DS не обязательно во время прерыва-
Турбо Ассемблер 3.0/tasm/#2-2 = 124 =
ния содержит значение DS Турбо Паскаля, но для получения доступа
к переменным и типизованным константам Турбо Паскаля можно ис-
пользовать указанную выше последовательность.
Турбо Ассемблер 3.0/tasm/#2-2 = 125 =
Устранение неиспользуемого кода
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В Турбо Паскале имеются средства, обеспечивающие устранение
неиспользуемого кода. Это означает, что в полученный в результате
файл .EXE не будет включаться код процедур и функций, который ни-
когда не выполняется. Но поскольку нет полной информации о содер-
жимом модулей Турбо Ассемблера, Турбо Паскаль может выполнять для
них только ограниченную оптимизацию.
Турбо Паскаль будет устранять код модуля .OBJ в том и только
в том случае, если к любой доступной процедуре или функции этого
модуля нет обращения. Если же на какую либо процедуру или функцию
имеется ссылка, то весь этот модуль используется.
Чтобы добиться большей эффективности использования средства
Турбо Паскаля по устранению неиспользуемого кода, неплохо было бы
разбить программу на Ассемблере на небольшие модули, которые со-
держали бы только несколько процедур или функций. Это позволило
бы Турбо Паскалю, если он может это сделать, уменьшить объем ва-
шей конечной программы.
Соглашения Турбо Паскаля по передаче параметров
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Турбо Паскаль использует для передачи параметров стек цен-
трального процессора (или, в случае передачи значений параметров
с одинарной, двойной, расширенной точностью или сложного типа,
стек арифметического сопроцессора). Параметры всегда вычисляются
и заносятся в стек в том порядке, в котором они указываются в
описании подпрограммы, слева направо. В данном разделе мы пояс-
ним, как эти параметры представляются.
Параметры-значения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Параметр-значение - это параметр, значение которого не может
изменяться подпрограммой, в которую он передается. В отличие от
многих компиляторов, Турбо Паскаль не выполняет слепого копирова-
ния в стек каждого параметра-значения: как мы далее поясним, ис-
пользуемый метод зависит от типа.
Скалярные типы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Параметры-значения всех скалярных типов (boolean, char,
shortint, byte, integer, word, longint, отрезки типов и перечис-
лимые типы) передаются как значения через стек процессора. Если
размер объекта составляет 1 байт, он заносится в стек, как полное
16-битовое слово, однако более значащий (старший) байт слова не
содержит полезной информации. Если размер объекта равен двум бай-
там, то он просто заносится в стек "как есть". Если объект имеет
|
adfun.ru
|
|
|
|