Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Турбо Ассемблер / Использование Турбо Ассемблера /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Интерфейс Турбо Ассемблера с Турбо Паскалем - Программирование от RIN.RU
Интерфейс Турбо Ассемблера с Турбо Паскалем



Ограничения при использовании объектов типа EXTRN


Синтаксис уточненного идентификатора Турбо Паскаля, при котором для доступа к объекту в заданном модуле используется имя модуля и точка, несовместим с синтаксическими правилами Турбо Ассемблера и будет, таким образом, отвергнут. Описание:


EXTRN SYSTEM.Assing : FAR


приведет к тому, что Турбо Ассемблер выдаст сообщение об ошибке.


Имеется также два других ограничения на использование в Турбо Паскале объектов EXTRN. Первое из них состоит в том, что в ссылках на процедуру или функцию не могут выполняться арифметические операции с адресами. Таким образом, если вы объявите:


EXTRN PublicProc : FAR


то не сможете записать оператор вида:


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 не обязательно во время прерывания содержит значение DS Турбо Паскаля, но для получения доступа к переменным и типизованным константам Турбо Паскаля можно использовать указанную выше последовательность.


Устранение неиспользуемого кода


В Турбо Паскале имеются средства, обеспечивающие устранение неиспользуемого кода. Это означает, что в полученный в результате файл .EXE не будет включаться код процедур и функций, который никогда не выполняется. Но поскольку нет полной информации о содержимом модулей Турбо Ассемблера, Турбо Паскаль может выполнять для них только ограниченную оптимизацию.


Турбо Паскаль будет устранять код модуля .OBJ в том и только в том случае, если к любой доступной процедуре или функции этого модуля нет обращения. Если же на какую либо процедуру или функцию имеется ссылка, то весь этот модуль используется.


Чтобы добиться большей эффективности использования средства Турбо Паскаля по устранению неиспользуемого кода, неплохо было бы разбить программу на Ассемблере на небольшие модули, которые содержали бы только несколько процедур или функций. Это позволило бы Турбо Паскалю, если он может это сделать, уменьшить объем вашей конечной программы.


Соглашения Турбо Паскаля по передаче параметров


Турбо Паскаль использует для передачи параметров стек центрального процессора (или, в случае передачи значений параметров с одинарной, двойной, расширенной точностью или сложного типа, стек арифметического сопроцессора). Параметры всегда вычисляются и заносятся в стек в том порядке, в котором они указываются в описании подпрограммы, слева направо. В данном разделе мы поясним, как эти параметры представляются.


Параметры-значения


Параметр-значение - это параметр, значение которого не может изменяться подпрограммой, в которую он передается. В отличие от многих компиляторов, Турбо Паскаль не выполняет слепого копирования в стек каждого параметра-значения: как мы далее поясним, используемый метод зависит от типа.


Скалярные типы


Параметры-значения всех скалярных типов (boolean, char, shortint, byte, integer, word, longint, отрезки типов и перечислимые типы) передаются как значения через стек процессора. Если размер объекта составляет 1 байт, он заносится в стек, как полное 16-битовое слово, однако более значащий (старший) байт слова не содержит полезной информации. Если размер объекта равен двум байтам, то он просто заносится в стек "как есть". Если объект имеет размер 4 байта (длинное целое), он заносится в стек, как два 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.


Единственное исключение из этого правила - это случай, когда подпрограмма в перекрываемом (оверлейном) модуле A передает как параметр-значение константу-множество подпрограмме в оверлейном модуле B. В этом контексте перекрываемый модуль означает любой модуль, компилированный с директивой {$O+} (допускаются оверлеи). В этом случае перед тем, как будет сделан вызов и адрес стека будет передан программе в модуле B, в стеке для множества-константы резервируется временная память.


Параметры-переменные


Все параметры-переменные (var) передаются точно также: как указатель дальнего типа на их действительные адреса в памяти.


<<<  НазадВперед  >>>
 1  2  3  4  5  6  7  8 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Начало работы на Турбо Ассемблере

Использование директив и параметров

Общие принципы программирования

Объектно-ориентированное программирование

Использование выражений и значений идентификаторов

Директивы выбора процессора

Использование моделей памяти программы и сегментации

Определение типов данных

Задание и использование счетчика адреса

Описание процедур

Управление областью действия идентификаторов

Определение данных

Расширенные инструкции

Использование макрокоманд

Использование условных директив

Интерфейс с компоновщиком

Генерация листинга

Интерфейс Турбо Ассемблера и Borland C++

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь