а я в ассемлере аврстудии вложенными макросами вполне пользуюсь. Действительно удобно :) примерно выглядит так:
(в общем не так уж и параноидально :)) и вполне даже красиво (на мой взгляд :))
;----------------------------------------------------------------------------
;Макросы управления тактовой частотой (с сохранением 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