Автор забросил fasmarm?
Не знаю. Последний релиз вышел с месяц назад. Если хотите - можете сами у него спросить, ссылку на форум я дал выше. Автор молчит, поэтому либо упорно трудится и радикально перерабатывает генерацию отладочной информации, либо просто забил на это дело.
Изначально fasmarm умеет генерировать отладочную информацию отдельным файлом в формате *.fas, но ни один сторонний отладчик (кроме Ольки с соответствующим плагином) не умеет с ней работать. Автор надстройки сделал возможность в fasmarm генерировать отладочную информацию в формате DWARF2, которая упрятывается в соответствующие секции эльфа.
Объектный ELF (файл *.o) не содержит абсолютных адресов, поэтому связать листинг, который генерит objdump из файла *.o с конечным бинарником может быть весьма трудно. Но это дело вкуса
Если as умеет генерировать только объектный ELF (*.o), которые нужно потом линковать ld в исполняемый ELF (*.elf, *.axf) и потом получать bin или hex, то fasmarm помимо объектного эльфа умеет генерировать сразу исполняемый ELF, поэтому никакие линкеры ему не требуются.
Исполняемый ELF содержит помимо таблицы символов (которая содержится и в объектнике и где прописаны имена меток, констант и т.д.) ещё и другую отладочную информацию в формате DWARF2 (например сопоставление абсолютных адресов с номерами строк исходного кода).
Поэтому если пользовать fasmarm, то есть резон генерировать сразу исполняемый ELF, а не объектник.
Для этого:
Вообще fasmarm имеет много преимуществ перед as. Одна только директива virtual at чего стОит!

Единственный недостаток - приколы с генерацией отладочной информации. Но мне это не очень мешает.
Вот пример кода из одного проекта для STM32F030:
Код: Выделить всё
rcc_config: ;Configure HSE
ldr r3,[.rcc_base]
virtual at r3
.rcc RCC_TypeDef
end virtual
ldr r0,[.rcc.CR] ;enable HSE oscillator
ldbit r1,RCC_CR_HSEON
orrs r0,r1
str r0,[.rcc.CR]
ldbit r1,RCC_CR_HSERDY
@@: ;wait until oscillator is ready
ldr r0,[.rcc.CR]
tst r0,r1
beq @r
;Configure PLL
ldr r0,[.rcc.CFGR]
ldbit r1,RCC_CFGR2_PREDIV1 ;PREDIV = 1 (PLL input clock not divided)
bics r0,r1
str r0,[.rcc.CFGR]
ldr r0,[.rcc.CFGR]
ldbit r1,RCC_CFGR_PLLMUL ;PLLMUL = x2
bics r0,r1
ldbit r1,RCC_CFGR_PLLSRC_PREDIV1 ;HSE/PREDIV as PLL clock source
orrs r0,r1
ldbit r1,RCC_CFGR_HPRE ;HCLK not divided
bics r0,r1
ldbit r1,RCC_CFGR_PPRE ;PCLK not divided
bics r0,r1
str r0,[.rcc.CFGR]
ldr r0,[.rcc.CR] ;enable PLL
ldbit r1,RCC_CR_PLLON
orrs r0,r1
str r0,[.rcc.CR]
ldbit r1,RCC_CR_PLLRDY
@@: ;wait until PLL is ready
ldr r0,[.rcc.CR]
tst r0,r1
beq @r
ldr r0,[.rcc.CFGR] ;select PLL as system clock
ldbit r1,RCC_CFGR_SW
bics r0,r1
ldbit r1,RCC_CFGR_SW_PLL
str r0,[.rcc.CFGR]
ldbit r1,RCC_CFGR_SWS
ldbit r2,RCC_CFGR_SWS_PLL
@@: ;wait until new clock source selected
ldr r0,[.rcc.CFGR]
ands r0,r1
cmp r0,r2
bne @r
;Enable peripheral clocks on AHB
ldr r0,[.rcc.AHBENR]
ldr r1,[.ahb_clk_en]
orrs r0,r1
str r0,[.rcc.AHBENR]
;Enable peripheral clocks on APB
ldr r0,[.rcc.APB2ENR]
ldr r1,[.apb2_clk_en]
orrs r0,r1
str r0,[.rcc.APB2ENR]
ldr r0,[.rcc.APB1ENR]
ldr r1,[.apb1_clk_en]
orrs r0,r1
str r0,[.rcc.APB1ENR]
bx lr
align 4
.rcc_base dw RCC_BASE
.ahb_clk_en dw RCC_AHBENR_GPIOAEN+RCC_AHBENR_GPIOBEN+RCC_AHBENR_DMAEN
.apb2_clk_en dw RCC_APB2ENR_ADCEN+RCC_APB2ENR_SPI1EN+RCC_APB2ENR_TIM1EN
.apb1_clk_en dw RCC_APB1ENR_TIM14EN
И это с минимумом макросов. Удобство написания кода впечатляет!
