Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Program Size:
text data bss dec hex filename
52 0 65536 65588 10034 Gate_Tester.elf
void min_Reset_Handler();
#define STACK_SIZE 0x00004000 /*!< Stack size (in Words) */
__attribute__ ((section(".co_stack"))) unsigned long minStack[STACK_SIZE];
__attribute__ ((section(".min_isr_vector"))) void (* const minVectors[])(void) =
{
(void *)&minStack[STACK_SIZE-1], /*!< The initial stack pointer*/
min_Reset_Handler, /*!< Reset Handler */
};
void min_Reset_Handler()
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
GPIOD->MODER |= GPIO_MODER_MODER15_0;
uint32_t counter;
volatile uint32_t *led = (*(volatile uint32_t *)(PERIPH_BB_BASE + ((((uint32_t)&GPIOD->ODR) - PERIPH_BASE)*32) + 15*4));
while (true)
{
(*led) = counter >> 31;
counter += 1024;
}
}
Disassembly of section .text:
08000000 <minVectors>:
8000000: fc ff 00 10 09 00 00 08 ........
08000008 <min_Reset_Handler>:
8000008: 4b08 ldr r3, [pc, #32] ; (800002c <min_Reset_Handler+0x24>)
;RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
800000a: 6b19 ldr r1, [r3, #48] ; 0x30
800000c: f041 0108 orr.w r1, r1, #8
8000010: 6319 str r1, [r3, #48] ; 0x30
;GPIOD->MODER |= GPIO_MODER_MODER15_0;
8000012: f5a3 5330 sub.w r3, r3, #11264 ; 0x2c00
8000016: 6819 ldr r1, [r3, #0]
8000018: f041 4180 orr.w r1, r1, #1073741824 ; 0x40000000
800001c: 6019 str r1, [r3, #0]
;volatile uint32_t *led = (*(volatile uint32_t *)(PERIPH_BB_BASE + ((((uint32_t)&GPIOD->ODR) - PERIPH_BASE)*32) + 15*4));
800001e: 4b04 ldr r3, [pc, #16] ; (8000030 <min_Reset_Handler+0x28>)
;uint32_t counter;
8000020: 681b ldr r3, [r3, #0]
<min_Reset_Handler_while>:
8000022: 0fd1 lsrs r1, r2, #31 ;
8000024: 6019 str r1, [r3, #0] ; (*led) = counter >> 31;
8000026: f502 6280 add.w r2, r2, #1024 ; counter += 1024;
800002a: e7fa b.n 8000022 <min_Reset_Handler_while>
800002c: 40023800 .word 0x40023800
8000030: 424182bc .word 0x424182bc

OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
/* Internal Memory Map*/
MEMORY
{
rom (rx) : ORIGIN = 0x08000000, LENGTH = 0x000F8000
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000
ccm (rwx) : ORIGIN = 0x10000000, LENGTH = 0x00010000
}
_eram = 0x20000000 + 0x00020000;
/* Section Definitions */
SECTIONS
{
.text :
{
. = 0x00000000;
/*KEEP(*(.isr_vector .isr_vector.*))*/
KEEP(*(.min_isr_vector .min_isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)
*(.rodata .rodata* .gnu.linkonce.r.*)
} > rom
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > rom
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > rom
__exidx_end = .;
. = ALIGN(4);
_etext = .;
_sidata = .;
.data : AT (_etext)
{
_sdata = .;
*(.data .data.*)
. = ALIGN(4);
_edata = . ;
} > ram
/* .bss section which is used for uninitialized data */
.bss (NOLOAD) :
{
_sbss = . ;
*(.bss .bss.*)
*(COMMON)
. = ALIGN(4);
_ebss = . ;
} > ram
/* stack section */
.co_stack (NOLOAD):
{
. = ALIGN(8);
*(.co_stack .co_stack.*)
} > ccm
. = ALIGN(4);
_end = . ;
} 
Disassembly of section .text:
00000000 <AB_STACK-0x8>:
0: 00000008 .word 0x00000008
4: 00000015 .word 0x00000015
00000008 <AB_STACK>:
8: 00000001 .word 0x00000001
c: 4247060c .word 0x4247060c
10: 42418038 .word 0x42418038
00000014 <Reset>:
14: bc0e pop {r1, r2, r3}
16: 6019 str r1, [r3, #0]
18: 6011 str r1, [r2, #0]
0000001a <BLINK_LOOP>:
1a: 0fe1 lsrs r1, r4, #31
1c: f8c3 1284 str.w r1, [r3, #644] ; 0x284
20: f504 6480 add.w r4, r4, #1024 ; 0x400
24: e7f9 b.n 1a <BLINK_LOOP>

Насчёт глобальных и локальных меток… помню лет 20 назад когда кодил на асме в турбоасме были директивы для этого, помоему это global и import если не ошибаюсь, попробуй поискать аналогичные
STM32F4: GNU AS: Мигаем светодиодом (Версия для STM32F4 Discovery, Оптимизация) (Часть 3)