Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Большинство примеров являются оригинальными разработками автора и
более нигде не встречаются. Поэтому везде, где необходимо, даются подробные
комментарии, особенно для программ на языках высокого уровня.
К сожалению, мы не сможем подробно рассмотреть все аспекты программирования
в Visual С + + .NET и Delphi 7, однако многие сведения, необходимые
для практической работы, приводятся по ходу описания программного
кода.
Программные модули на ассемблере мы будем разрабатывать с использованием
компиляторов TASM 5.0 фирмы Borland и MASM 6.14 фирмы
Microsoft. Примеры исходных текстов программ будем приводить как для
TASM 5.0, так и для MASM 6.14. Каждый программист предпочитает работать
с определенными инструментами при написании программ. Кто-то
программирует в Delphi и предпочитает работать с TASM 5.0, кто-то работает
в Visual С + + и предпочитает MASM 6.14. Большинство же разработчиков
(в том числе и автор этих строк) применяют смешанные модели для разработки
приложений.
К сожалению, война стандартов между Microsoft и Borland вынуждает приводить
примеры интерфейсов с языками высокого уровня для двух этих
компиляторов по отдельности. Тем не менее постарайтесь минимизировать
все изменения и доработки программного кода на ассемблере при переходе
от TASM 5.0 к MASM 6.14 и наоборот.
Для написания наших ассемблерных модулей будем использовать упрощенный
синтаксис языков ассемблера. Это значит, что везде в исходных текстах
будут использоваться директивы .data и .code. Не будем описывать здесь
все опции компиляторов и компоновщиков MASM и TASM. В наших программах,
как правило, мы будем использовать несколько таких опций, и
разъяснения будут приводиться по ходу текста. Высокоуровневые конструкции
языков ассемблера мы также не будем здесь использовать — они экономят
место, но затрудняют анализ программ.
В примерах этой главы мы будем использовать отдельно скомпилированные
модули на ассемблере, которые будем компоновать с программами на
С++ .NET и Delphi 7. В общем случае командная строка для компилятора
TASM выглядит так:
tasm32 /ml <имя_файла.asm> <имя_файла.obj>
Если используется MASM, командная строка для компилятора будет выглядеть
следующим образом:
ml /с /Fo <имя_файла.obj> <имя_файла.asm>
Никакие дополнительные опции компиляторов для получения файлов с
расширением .OBJ не нужны.
Теперь поговорим более подробно о разработке интерфейса с языками высокого
уровня. При решении этой задачи программист должен учитывать
следующее:
- правила согласования имен идентификаторов (переменных и процедур),
помещенных в объектные файлы. Компилятор языка высокого уровня
может изменять или нет оригинальные имена в объектном модуле,
поэтому важно знать, происходит ли такое изменение и как;
• модель памяти, используемую ассемблерным модулем (tiny, small,
compact, medium, huge, large ИЛИ flat);
• параметры вызова нашей подпрограммы на ассемблере. Параметры вызова
— это довольно обширное понятие и включает следующие аспекты,
которые должен принимать во внимание программист:
• нужно ли сохранять регистры в подпрограмме? Если да, то какие;
• порядок передачи параметров вызываемой подпрограмме;
• метод передачи параметров в подпрограмму (с использованием регистров,
стека, разделяемой памяти);
• способ передачи параметров в вызываемую подпрограмму (по значению
или по ссылке);
• если передача параметров подпрограмме осуществляется через стек,
то как должен восстанавливаться указатель стека — вызывающей или
вызываемой подпрограммой;
• метод возвращения значения в вызывающую подпрограмму (через
стек, регистры или общую область памяти).
Рассмотрим все эти вопросы более подробно. Начнем с согласования имен
идентификаторов. Поскольку мы используем Delphi и Visual С++, то, соответственно,
будем рассматривать технологии работы с внешними подпрограммами
применительно к языкам Pascal и С++. С языком Pascal все просто.
Все строчные буквы в именах внешних идентификаторов
преобразуются в прописные. Компилятор С + + не изменяет регистра букв,
но имена идентификаторов по этой причине считаются чувствительными к
регистру. Кроме того, компилятор С++ перед всеми внешними именами
помещает префикс в виде символа подчеркивания.
Следующий момент — модели памяти, используемые внешними подпрограммами.
Для 32-разрядных приложений используется только одна модель
памяти — fiat. Она поддерживается как компилятором Pascal, так и С++.
Что касается параметров вызова внешних подпрограмм, то, несмотря на
сложность и некоторую запутанность описания во многих литературных источниках,
в реальной жизни все оказывается намного проще. Для программиста,
желающего разобраться с этими нагромождениями директив и соглашений, хочется выделить основные моменты процесса вызова внешних
процедур из языков высокого уровня.
• Для 32-разрядных приложений параметры в вызываемую процедуру передаются
одним из двух способов: либо по значению, либо по ссылке.
При передаче параметра по значению в процедуру передается непосредственно
сам 32-разрядный операнд, а при передаче по ссылке — адрес
(тоже 32-разрядное значение) этого операнда.
• Все параметры являются 32-разрядными. Понятия "ближняя ссылка" и
"дальняя ссылка" не различаются! Все ссылки в адресном пространстве
32-разрядных приложений являются "ближними". Например, не имеет
смысла объявлять подпрограммы как NEAR ИЛИ FAR:
MyProc PROC NEAR
или
MyProc PROC FAR
поскольку компилятор все равно интерпретирует все вызовы как ближние.
<< Назад В начало Далее >> |
|