Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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
поскольку компилятор все равно интерпретирует все вызовы как ближние.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru