Я пытаюсь создать голый металлический код, используя стандартную библиотеку lib C.
Я начал с кода ассемблера
.section .isr_vector
.global _Reset
_Reset:
B Reset_Handler /* Reset */
B . /* Undefined */
B . /* SWI */
B . /* Prefetch Abort */
B . /* Data Abort */
B . /* reserved */
B . /* IRQ */
B . /* FIQ */
.global Reset_Handler
Reset_Handler:
ldr sp, =_estack
mov fp, #0
// Branch to C code
BL _start
B .
Я нашел пример кода, использующего символ _estack
для определения стека
В файле компоновщика, который я поместил:
ENTRY(_Reset)
MEMORY
{
RAM (xrw) : ORIGIN = 0x00000000, LENGTH = 512M
}
/* define stack size and heap size here */
stack_size = 4*1024;
heap_size = 128*1024;
/* define beginning and ending of stack */
_estack = ORIGIN(RAM)+LENGTH(RAM);
_sstack = _estack - stack_size;
С помощью GDB я проверяю, что _estack находится в нужном месте 0x20000000
Когда я прослеживаю код и ввожу функцию _start, $ sp меняется на 0x80000
Это сделано беря информацию из ячейки памяти без символа:
-exec disas _start
Dump of assembler code for function _start:
0x00000084 <+0>: ldr r3, [pc, #84] ; (0xdc <_start+88>)
0x00000086 <+2>: cmp r3, #0
0x00000088 <+4>: it eq
0x0000008a <+6>: ldreq r3, [pc, #76] ; (0xd8 <_start+84>)
Вот мои командные строки:
arm-none-eabi-gcc -ffreestanding -specs=nano.specs -specs=nosys.specs -Wall -O0 -g3 -Wextra -std=c99 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -Iinclude -Llib src/main.c src/start.s -o bin/main -Xlinker -static -TSECTIONS.ld
arm-none-eabi-nm bin/main > bin/symbols.txt
arm-none-eabi-objdump --disassemble-all bin/main > bin/asm.S
arm-none-eabi-objdump -s bin/main > bin/MixedCASM.txt
Есть ли возможность узнать правильные символы, чтобы найти стек?