summaryrefslogtreecommitdiffstats
path: root/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S
blob: 09d5cc43d8184a50eaea1e875c2fc8c432a5c246 (plain)
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 Rcksprungadresse
	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 fr Rcksprung
	mov			pc, ip			@ Lade ip nach pc, entspricht Sprung in jeweilige SWI-Routine
	ldmfd		sp!, {pc}^			@ Rcksprung
STACK:
	.word 0x78c	

SWIJumpTable:
	.word init_ser
	.word	putchar
	.word	getchar
.end