組合語言 實現軟中斷機制

2021-08-28 06:27:06 字數 2653 閱讀 2315

cpu會自動識別產生的異常,並將當前的pc值定位到異常向量表的某乙個位置,但是由於異常的產生是隨機的,我們並不知道什麼時間會出現在什麼型別的異常,所以需要乙個異常向量表(也有說是中斷向量表),來完成對不同異常處理函式入口位址的對映。

中斷也是異常的一種,中斷有硬中斷(由硬體產生的中斷)和軟中斷(軟體產生的中斷)之分。arm有七種不同的中斷源,在中斷向量表中對應的位址範圍是0x00 ~ 0x1c,本章只介紹軟中斷。軟中斷執行由

swi指令產生,用於使用者模式下的程式呼叫特權操作指令。

我們可以通過軟體**來檢視程式的執行過程,首先硬體復位後,pc指向0x00(異常向量表中的第乙個位置),執行跳轉rest函式,通過swi觸發軟中斷,cpu幫我們將pc指向0x08這個位址,這裡有是乙個跳轉指令,跳轉到swi_hander函式。

所以,只要是異常產生,cpu就會幫我們把pc指標定位到異常向量表中某乙個位置,這裡實現位址的對映,指向什麼函式入口,需要我們自己來實現。

.text

.global _start

_start:

@異常向量表 0x00 - 0x1c

b rest @0x00 系統復位後的函式入口 rest

nop @0x04

b swi_handler @0x08 軟中斷函式位址入口

nop @0x012

nop @0x014

nop @0x018

nop @0x01c

swi_handler:

stmfd sp!, @將r0 lr的值進行壓棧儲存 sp!表示將 sp棧頂指標自動偏移

mov r0,#5

ldmfd sp!, @棧中的值將分別出棧賦值給 r0,pc

rest:

ldr sp,=stack_base @將位址棧底位址裝入sp

mov r0,#3

swi 2 @swi 觸發軟中斷

b rest

.data

.space 32 @棧空間分配

stack_base: @棧底指標

.end

.global _start    宣告全域性變數_start,整個工程可見
@ 表示乙個函式

swi_handler:

@...

@...

rest:     

@...

@...

@我們使用棧來做現場的儲存與恢復

stmfd sp!, @將r0 lr的值進行壓棧儲存

@...

@...

ldmfd sp!, @棧中的值將分別出棧賦值給 r0,pc

做了一些改進

出棧時恢復現場,同時恢復工作模式

利用軟中斷號來實現不同的功能

解決 b指令的缺陷 -- 無法操作位址長度較大的函式位址

由於產生軟中斷會將工作模式成為suv模式,如果想要中斷結束後恢復之前的模式,需要在出棧ldm後面加上 ^ ; swi 2產生軟中斷,2是軟中斷號,存放在這條指令空間中。由於異常發生時,處理器會把當前pc的值儲存到lr,所以我們通過lr中的值來拿到軟中斷號; 乙個b指令空間只有4個位元組,其中一部分還有存放操作碼,一些位址長度比較大的函式就無法實現了,我們用ldr指令來實現跳轉。

.text

.global _start

_start:

b rest @0x00 系統復位後的函式入口 rest

nop @0x04

ldr pc,_swi_handler @0x08 軟中斷函式位址入口

nop @0x012

nop @0x014

nop @0x018

nop @0x01c

_swi_handler:

.word swi_handler @乙個字的空間存放位址

do_swi:

mov r3, #3

mov r4, #4

mov pc,lr

swi_handler:

stmfd sp!, @將r0 lr的值進行壓棧儲存

sub r0,lr,#4 @取出軟中斷號,並且比較軟中斷號

ldr r0,[r0]

bic r0,#0xff000000 @清除高八位資料

cmp r0,#2

bleq do_swi @處理軟中斷

ldmfd sp!,^ @棧中的值將分別出棧賦值給 r0,pc ^代表出棧恢復入棧時的模式(user)

rest:

ldr sp,=stack_base @suv模式下

mrs r0,cpsr

and r0,r0,#0xffffffe0

orr r0,r0,#0x10

msr cpsr,r0 @進入user模式

mov r0,#3

swi 2 @swi 觸發軟中斷 中斷號為 2

b rest

.data

.space 200 @棧空間分配

stack_base: @棧底指標

.end

組合語言實現階乘

static int fact int n return fact n 1 n public static void main string args 開始遞迴函式呼叫 addiu sp,0,0x10010080 初始化棧位址 壓棧入參 addiu s0,0,5 n 5 sw s0,0 sp n 5...

組合語言實現氣泡排序

氣泡排序 author jrh 2011.7.10 assume ds data data segment a dw 1,4,2,5,7,9,6,3 data ends code segment start mov ax,data mov ds,ax mov cx,8 dec cx lop1 pus...

組合語言 內中斷

內中斷 在執行完當前正在執行的指令之後,檢測到從cpu內部發過來的或內部產生的一種特殊資訊,並且可以立即對所接收到的資訊進行處理 中斷資訊可以 於cpu外部和內部 內中斷的產生 1除法錯誤 0 2單步執行 1 3執行into指令 4 into 溢位中斷 4執行int指令,該指令格式 int n 指令...