Неправильные дебри. В другие надо было лезть.
-mno-interrupt говорит
С-компилятору, что прерываний в системе нет, поэтому ему не нужно их сохранять/запрещать/восстанавливать при операциях с указателем стека
-mno-tablejump говорит
С-компилятору не использовать таблицы переходов для реализации
switchА нужно не давать линкеру на линковку запускалку (gcrt), которая шьёт таблицу векторов по умолчанию и ещё всякое. Делается ключикм -nostdlib, при котором gcc от себя линкеру ключи библиотек не ставит.
Код
.nolist
#define __SFR_OFFSET 0
#include <avr/io.h>
.list
.text
main:
ser r16
out DDRB, r16
1:
inc r16
out PORTB, r16
rjmp 1b
; разместил после main просто для того, чтобы показать, что .vectors
; линекром всё равно ставится первой в начале флеша
.section .vectors,"ax",@progbits
start:
rjmp main
.end
avr-gcc
-nostdlib -mmcu=atmega8 t.S -o t.elf
avr-objdump -d t.elf
Код
t.elf: file format elf32-avr
Disassembly of section .text:
00000000 <start>:
0: 00 c0 rjmp .+0 ; 0x2 <__ctors_end>
; на это имя не обращать внимания, оно у линкера прописано в скрипте, дизасм его посчитал важнее
00000002 <__ctors_end>:
2: 0f ef ldi r16, 0xFF; 255
4: 07 bb out 0x17, r16; 23
6: 03 95 inc r16
8: 08 bb out 0x18, r16; 24
a: fd cf rjmp .-6 ; 0x6 <__ctors_end+0x4>
Если пишете на С, то библиотеки нужны.
Вероятно, будет достаточно сделать асмовый файлик с вон тем .vectors (добавить строку
.global main) и добавить его в проект, в ключи линкеру добавить -lgcc -lc для подключения стандартных библиотек. -mno-interrupt будет плезен для сокращения кода.
---------------------
Не-а, соврал...
Надо ведь остальную часть запускающего кода заставить работать (обнуление __zero_reg__, инициализация статических данных, обнуление .bss, инициализация стека). Так что в .vectors надо ставить не rjmp main, а переход на нужную часть запускалки.
Лучше всего взять иcходники gcrt1.S из
avr-libc (линк download в самом низу страницы) и допилить его до нужного состояния путём оставления в секции .vectors только строки XJMP __init
Если не нужно инициализировать стаические переменные, то тоже почистить ненужное.