MS-DOS и TASM 2.0. Часть 15. Упрощаем вызов функции в TASM.

Макрос функции в TASM.

Макрос — макрокоманда, макроопределение.

У большинства популярных ассемблеров (TASM, MASM, FASM), имеется определённая «вкусность», которая помогает писать более читабельный и понятный код, а также уменьшает вероятность ошибок. Мы имеем ввиду макросы. Макрос — миникод, который определяет алгоритм действий основных команд ассемблера. Этот код либо уже создан и входит в комплект ассемблера, либо пишется пользователем самостоятельно. В данной статье мы выясним, как использовать макрос функции (процедуры), встроенный в TASM.

Как уже говорилось, в коде одной программы могут быть реализованы несколько приемлемых вариантов и не только стандартных (конвенционных) — выбор за вами. Общие понятия и ключевые моменты изложены в статье: «MS-DOS и TASM 2.0. Часть 15. Процедуры (функции)» и мы не будем повторяться.

Мы будем использовать макроопределение вызова процедуры PASCAL, которое поддерживается TASM.

Реализация конвенции PASCAL в TASM.

Не будем копать слишком глубоко — нам необходимо понимание наиболее оптимальных способов организации вызова функций при программировании с использованием TASM в MS-DOS.

Мы рассмотрим пример реализации конвенции PASCAL. Это связано с тем, что мы используем TASM — программный пакет компании Borland. А Borland — это синоним слову «Рascal» (Object Pascal->Borland Delphi->Embarcadero Delphi). А в TASM конвенция вызова функций PASCAL реализована очень круто для своего времени посредством макроса и существенно упрощает программирование ассемблером в системе MS-DOS.

Конвенция вызова функций PASCAL (Pascal, Basic, Fortran и др.): параметры загоняются в стек слева направо — сверху вниз, стек очищается вызываемой функцией.

Функция (процедура) содержит пять параметров:
myFunc (a,b,c,d,e)

Ниже — исходный код несколько модернизированной программы goblin.asm. Конвенция PASCAL реализована по всем правилам, «ручками» и без всяких макросов.

Пример чистой реализации конвенции PASCAL.

Исходный код GBLPROC1.ASM

Можете прогнать наш GBLPROC1.COM через IDA и посмотреть, как сработал компилятор.

Макрос функции конвенции PASCAL, реализованный в TASM.

Теперь будем использовать встроенный в TASM макрос функции. Он очень прост:

Исходный код GBLPROC2.ASM

Прогоняем код через IDA.

чуть-чуть подрабатываем ручками комментарии (для Вас, исключительно, для Вас — любимых!) и сохраняем в ассемблерном варианте (GBLARC2.ASM) , а также в текстовом варианте (GBLPROC2.LST).

GBLPROC2.ASM

GBLPROC2.LST

 Макросы в TASM — будьте внимательны!

Хочется обратить Ваше внимание на определённый момент. Макросы в TASM продуманы и подогнаны под совместное использование друг с другом. Вы заметили, что в коде, написанном вручную отсутствует макрос local (local tmp:WORD). Локальная переменная (в нашем случае) будет работать корректно только, если мы используем макрос функции func PASCAL, arg1, arg2… так как локальные переменные тоже используют стек. Не представляя, как реально будет отображён макрос в реальном коде, в целях избежания сложно определяемых ошибок, нужно пользоваться правилами.

  1. Старайтесь не смешивать использование макросов и чистого кода, по крайней мере при написании одного блока программа, например — одной функции. Выбирайте один подход — либо макрокоманды, либо чистый код.
  2. Проверяйте код каждой функции через отладчик (обязательно) и дизассемблер (желательно).
  3. Старайтесь изучить, понять и запомнить реальный код, в который преобразуется макроопределение.

Мы продемонстрировали, как использовать макрос функции для упрощения кода программы, набор макросов и других «приятностей» у TASM большой — советуем просмотреть в нашем архиве (DOS-1.RAR)  «Справочник по системе программирования ТУРБО АССЕМБЛЕР 2.0 (под руководством Орлова С.Б.)»: D:\TASM.2_0\DOC\ — между прочем, на русском языке.

Не только макросы могут удивить програмиста странным кодом — результатом. Сам ассемблер, TASM в этом не исключение,  преподносит часто сюрпризы, транслируя ваш код, как ему захочется, исходя из соображений скорости исполнения либо экономии объёма используемой памяти. Отсюда вывод: отладчик и дизассемблер должны стать вашими постоянными и лучшими друзьями.

Добавить комментарий