Программное прерывание (SWI)
Эта команда будет выполнена, если условие истинно. Все различные условия ее выполнения перечислены в таблице 6. Машинный код команды приведен на рис.33.
Рис. 33. Команда программного прерывания
Команда программного прерывания используется для входа в защищенный режим (Supervisor), выполнение которой вызывает прерывание работы программы и передачу управления в соответствующий обработчик, при этом происходит смена режима работы ядра ARM7TDMI. В регистр PC записывается определенное значение, соответствующее вектору обработчика (0x08), а содержимое CPSR сохраняется в специальном регистре SPSR_svc. Защита обработчика программного прерывания от возможности изменений из основной программы или приложения (и контроллером внешней памяти) позволяет построить на основе команды SWI полностью защищенную операционную систему.
Возврат из прерывания
Так как перед передачей управления обработчику программного прерывания содержимое регистра PC предварительное сохранено в R14_svc, то для возможности правильного возврата из прерывания фактически в R14_svc заносится адрес команды, сразу следующий за командой SWI. При выполнении команды MOVS PC,R14_svc восстанавливается содержимое CPSR и возвращается управление в основную прерванную программу. Необходимо отметить, что этот способ входа и выхода из такого прерывания не позволяет реализовывать вложенные прерывания, поэтому внутри этого обработчика необходимо вручную сохранять адрес возврата (PC) и флаги процессора (SPSR), а перед выходом из него вручную восстанавливать указанные регистры.
Поле комментариев
Младшие 24-х бита кода при выполнении команды SWI всегда игнорируются, поэтому это поле комментариев может быть использовано, например, для передачи внутрь обработчика программного прерывания дополнительной информации. Например, в этом поле можно передавать индекс внутри массива указателей на подпрограммы, выполняющие определенные функции для защищенного режима.
Число машинных тактов
Команда SWI выполняется за 2S + 1N, где S и N зависят от типа машинных тактов.
Синтаксис в ассемблере
SWI{cond} <выражение>
где:
{cond}: |
двухсимвольная мнемоника условия выполнения команды (см. табл. 6); |
{выражение}: |
результат вычисления этого выражения размещается в поле комментариев в коде самой команды. |
Примеры
SWI ReadC ; Get next character from read stream.
SWI WriteI+"k" ; Output a "k" to the write stream.
SWINE 0 ; Conditionally call supervisor
; with 0 in comment field.
|
Код обработчика (Supervisor)
Предыдущие примеры подразумевают существование обработчика, например, подобного этому:
0x08 B Supervisor ; Точка входа в программное прерывание
EntryTable ; Адреса функций, используемых в обработчике
DCD ZeroRtn
DCD ReadCRtn
DCD WriteIRtn
. . .
Zero EQU 0
ReadC EQU 256
WriteI EQU 512
; Этот обработчик использует биты [23:8] в качестве
; адреса функции и биты [7:0] в качестве передаваемых данных (если они есть).
; R13_svc - указатель на вершину стека.
Supervisor
STMFD R13,{R0-R2,R14} ; Сохранить используемые регистры и адрес возврата
LDR R0,[R14,#-4] ; Получить адрес команды SWI
BIC R0,R0,#0xFF000000 ; Замаскировать старшие 8 бит.
MOV R1,R0,LSR#8 ; Вычислить содержимое поля комментариев команды.
ADR R2,EntryTable ; Получить адрес таблицы EntryTable
LDR R15,[R2,R1,LSL#2] ; Вызвать соответствующую подпрограмму из таблицы
WriteIRtn ; Младший байт содержит обрабатываемый символ
. . . . . .
LDMFD R13,{R0-R2,R15}^ ; Восстановить регистры
; и возвратиться в основную программу
; восстановив режим работы ядра
|
<---- Вернуться к Системе команд --->
|