@---------------------------------------------------------------------------- @ 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