Статьи по Assembler

       

@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.




Содержание раздела