@Struct.inc для mycall (ассемблер)
Это файл структурных макросов для приложения MyCall на ассемблере. Этот файл в текстовом формате вместе со всеми остальными файлами, необходимыми для компиляции приложения MyCall, содержится в zip-файле mycallab.zip (15913 байт). Имеется также Инструкция программиста.
Для получения комментариев щелкaйте по тексту или пользуйтесь групповым управлением:
if(dhtml){document.write("Все комментарии: [+][-] Открывать: [несколько]");}
;Этот прием совместно с завершиющим ENDIF позволяет предотвратить
;ошибочное многократное включение файла @struct.inc в проект
IFNDEF @@struct_inc
@@struct_inc=1;
;Замена штатного написания структурных операторов MASM с лидирующей точкой
;на написание с лидирующим @. Повышает читаемость листингов:
;- зритильно выравнивает левый край записи, так как плотность символа @ сравнима
;с плотностью букв, чего не скажешь о точке
;- позволяет легче обнаруживать взглядом структурные операторы, так как символ @
;хорошо заметен в потоке текста
@if equ <.if>
@while equ <.while>
@break equ <.break>
@endif equ <.endif>
@endw equ <.endw>
@else equ <.else>
@elseif equ <.elseif>
@repeat equ <.repeat>
;Пара макросов, позволяющих сохранять в стеке произвольное количество регистров.
;Это очень удобно. Пара команд процессора pusha/popa, сохраняющая все регистры разом,
;применима далеко не всегда, так как восстанавливает все регистры, в том числе и те,
;содержимое которых следовало бы оставить без восстановления. А применять цепочки
;команд push и pop некрасиво - и так ассембленый листинг вытянут в длину.
;Предлагаемые макросы позволяют записывать сохраняемые регистры в строку.
;Причем порядок регистров в обоих макросах одинаков, например: @push eax,ecx,esi и
;@pop eax,ecx,esi. Это позволяет при наборе формировать команду @pop путем
;копирования строки команды @push с последующей заменой слова @push на @pop. Таким
;образом существенно снижается количество труднообнаружимых ошибок, вроде
;перепутывания порядка сохранения/восстановления регистров.
@push MACRO p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,pa,pb,pc,pd,pe,pf
FOR param,<p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,pa,pb,pc,pd,pe,pf>
IFNB <param>
push param
ENDIF
ENDM
ENDM
@pop MACRO p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,pa,pb,pc,pd,pe,pf
FOR param,<pf,pe,pd,pc,pb,pa,p9,p8,p7,p6,p5,p4,p3,p2,p1,p0>
IFNB <param>
pop param
ENDIF
ENDM
ENDM
; Стандартный набор директив для прикладного программирования под win32.
;Вынесен сюда, чтобы не засорять основной листинг.
;ВНИМАНИЕ! Файл @struct.inc должен включаться первым!
.386
.Model flat,stdcall
;См. примечание к первому оператору в этом файле.
ENDIF
Варианты реализации макросов @push/@pop в версии Андрея Бордачева - в статье Макросы First и Second.