а я в ассемлере аврстудии вложенными макросами вполне пользуюсь. Действительно удобно :) примерно выглядит так:
(в общем не так уж и параноидально :)) и вполне даже красиво (на мой взгляд :))
;----------------------------------------------------------------------------
;Макросы управления тактовой частотой (с сохранением BaudRate коммуникационных портов (только UART!!)
;SystemClock_GrownUp - для рабочего режима
;SystemClock_SlowDown - для режима пониженного энергопотребления
;
;Синтаксис: SystemClock_SlowDown/SystemClock_GrownUp
;(C) Novus-Лаб (VK) 20/IX.13
.macro SystemClock_SlowDown
ldi TMP,IdleClock_ratio ;Поместим в TMP параметр кратости системной частоты для Idle-режима
call Set_SystemClock ;Настроим систему тактирования на новую частоту и засинхронизируемся от неё
call Refresh_UARTs_BaudRate ;Перенастроим BaudRate портов (в т.ч. и iAP порта), чтобы сохранить их скорость на новой тактовой частоте.
.endmacro
;----------------
.macro SystemClock_GrownUp
ldi TMP,WorkClock_ratio ;Поместим в TMP множитель PLL для Work-режима
call Set_SystemClock ;Настроим систему тактирования на новую частоту и засинхронизируемся от неё
call Refresh_UARTs_BaudRate ;Перенастроим BaudRate портов (в т.ч. и iAP порта), чтобы сохранить их скорость на новой тактовой частоте.
.endmacro
сами П/П тоже сожержат макросы :)
или так: прям макрос в макросе без взяких подпрограмм :)
;Макрос считывания блока данных заданой длины из EEPROM в RAM для контроллера XMEGA
;NVM контроллер в П/П чтения д.б. сконфигурирован так, чтобы можно было использовать команды ld/st (MAPPED EEPROM)
; EEPROM_Address - Адрес размещения блока данных в EEPROM
; RAM_Address - Адрес размещения считанных данных в RAM
; QNTY - Длина считываемого блока (до 256 байт) 1..256
;Синтаксис:
;XRead_EEPROM_to_RAM RAM_Address,EEPROM_Address,QNTY
;05/VIII.14
.macro XRead_EEPROM_to_RAM
PUSH_X
PUSH_Z
LDZ MAPPED_EEPROM_START+@1 ;Адрес начала размещения считываемых данных в EEPROM
LDX @0 ;Адрес размещения считанных данных в RAM
ldi TMP,@2-1 ;Длина блока считываемых данных
call ReadEEPROM_ZX ;Вызов П/П блочного чтения EEPROM-->RAM
POP_Z
POP_X
.endmacro