1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
@----------------------------------------------------------------------------
@ File Name : swi.S
@ Object : SoftwareInterruptHandler
@
@ 1.0 27/10/02 GR : Creation
@
@----------------------------------------------------------------------------
.global SWIHandler
.text
SWIHandler:
ldr sp, STACK @ den Wert von STACK (0x78c) auf sp kopieren
stmfd sp!, {lr} @ retten der R�cksprungadresse
ldr ip,[r14, #-4] @ hole "swi X" Aufruf in ip (lr steht auf Aufruf nach swi Befehl im aufrufenden Programm)
bic ip, ip, #0xff000000 @ maskiere X aus und speichere in ip
mov ip, ip, lsl #2 @ X ist in ip, X * 4 (entspricht lsl #2) ist Offset des swi
ldr lr, =SWIJumpTable @ Lade Adresse von SWIJumpTable in lr
ldr ip, [lr, ip] @ Addiere ip (Offset des SWI) zu Adresse SWIJumpTable und speichere in ip
mov lr, pc @ Speichere pc in lr f�r R�cksprung
mov pc, ip @ Lade ip nach pc, entspricht Sprung in jeweilige SWI-Routine
ldmfd sp!, {pc}^ @ R�cksprung
STACK:
.word 0x78c
SWIJumpTable:
.word init_ser
.word putchar
.word getchar
.end
|