Hallo,
angenommen ich habe folgendes Programm
1 | #include <avr/io.h>
|
2 |
|
3 | int main()
|
4 | {
|
5 | while(1);
|
6 | }
|
dann generiert mir der gcc eine Interrupt Vektor Tabelle der Form
1 | 00000000 <__vectors>:
|
2 | 0: 0c 94 2a 00 jmp 0x54 ; 0x54 <__ctors_end>
|
3 | 4: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
|
4 | .
|
5 | .
|
6 | .
|
7 | 50: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
|
so, diese Adressen möchte ich nun ändern ohne dabei die Interrupt
Funktionalität die mir die avr-libc zur Verfügung stellt zu benutzen.
dazu nehme ich folgenden Assembler code
1 | .section .vectors
|
2 |
|
3 | .org 0x0000
|
4 | jmp INIT
|
5 | jmp INIT
|
6 | jmp INIT
|
7 | jmp INIT
|
8 | jmp INIT
|
9 | jmp INIT
|
10 | jmp INIT
|
11 | jmp INIT
|
12 | jmp INIT
|
13 | jmp INIT
|
14 |
|
15 | INIT:
|
16 | nop
|
17 | reti
|
die Funktionalität ist dabei hier erstmal ohne Bedeutung, es geht mir um
das Prinzip
so, wenn ich jetz den C und ASM Code übersetze und zusammen linke kommt
dabei folgendes raus:
1 | 00000000 <__vectors>:
|
2 | 0: 22 c0 rjmp .+68 ; 0x46 <__ctors_end>
|
3 | 2: 3d c0 rjmp .+122 ; 0x7e <__bad_interrupt>
|
4 | .
|
5 | .
|
6 | .
|
7 | 18: 32 c0 rjmp .+100 ; 0x7e <__bad_interrupt>
|
8 | 1a: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
9 | 1e: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
10 | 22: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
11 | 26: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
12 | 2a: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
13 | 2e: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
14 | 32: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
15 | 36: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
16 | 3a: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
17 | 3e: 0c 94 21 00 jmp 0x42 ; 0x42 <INIT>
|
ich möchste jedoch das die Vektortabelle ersetzt wird
Wie genau stelle ich das am besten an?
Grüße
Thomas