Advertisement
teplofizik

swi.s (7)

Aug 9th, 2012
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Драйвер программных прерываний
  2. ; http://teplofizik.diary.ru/p179508680.htm
  3. ; Плата STM32F4-Discovery
  4.  
  5.     ; Проверять выравнивание стека (8 байт)
  6.     PRESERVE8
  7.    
  8.     AREA    |.text|, CODE, READONLY
  9.  
  10.             EXPORT  SVC_Handler
  11.            
  12.             GET swi_table.inc
  13.  
  14. ; Обработчик программного прерывания
  15. SVC_Handler PROC
  16.             PUSH {R8-R9,R12,LR}
  17.  
  18.             ; Получение номера прерывания
  19.             LDR   R12, [SP, #0x28] ; PC
  20.             LDRB  R12, [R12, #-2]   ; Младший байт инструкции (номер)
  21.  
  22.             ; Проверим номер на допустимость (а то улетим куда)
  23.             MOV32 R8, SWI_Count
  24.            
  25.             ; Если много - выходим.
  26.             CMP   R12, R8
  27.             BGE   swi_exit
  28.            
  29.             ; Умножим номер на 4, получим смещение.
  30.             LSL   R12, #2
  31.            
  32.             ; И прибавим к началу таблицы
  33.             MOV32 R8, SWI_Table
  34.            
  35.             ; Загрузим адрес функции
  36.             LDR   R12, [R8, R12]
  37.            
  38.             ; Вызов функции
  39.             BLX   R12
  40.            
  41.             ; Скопипастим R0 обратно в стек
  42.             STR   R0, [SP, #0x10]
  43.            
  44. swi_exit
  45.             POP  {R8-R9,R12,PC}
  46.             ENDP
  47.  
  48.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement