arm7支援四種堆疊模式:滿遞減(fd)、滿遞增(fa)、空遞減(ed)、空遞增(ea)
fd:堆疊位址從上往下遞減,且指標指向最後乙個入棧元素。
fa:堆疊位址從下往上遞增,且指標指向最後乙個入棧元素。
ed:堆疊位址從上往下遞減,且指標指向下乙個可用空位。
ea:堆疊位址從下網上遞增,且指標指向下乙個可用空位。
adsc編譯器只支援fd,ucos堆疊模式只能配置遞增或遞減,關於滿和空無法配置。
所以在移植的時候需要改動ostaskstkinit函式,使其跟中斷堆疊操作一致。
arm是risc的機器沒有自己的push pop 指令,通常使用stmldm指令完成壓入彈出操作。arm的使用r13=sp ,r14=lr ,r15=pc
當然在不同的模式下後又不同的影子暫存器,這裡的影子是說,他們雖然使用了同樣的名稱,但是實際的實體地址不是相同的空間,只是認為的做了一些關係的map。因為這樣可以加速資料的處理。
因為arm是3級流水線執行,通常執行的指令是pc-8也就是說執行的指令不是當前的pc指標值。
同arm相關的通常是!,s,^這些比較特殊的東西,
尤其對於ldr指令而言,在使用前偏移地時候就有了!,這同後偏移不同
前【rn,rm,#**】 這種型別是先進行偏移然後載入資料,更具是否!更新rn
後【rn】,rm,#××這是先載入資料,然後進行偏移,一定更新rn
s通常是乙個時候更新標誌,有時候如果存在pc(r15)載入的話,會作為更新cpsr的選項,
^這個用到的時候通常不多。這也是同cpsr,spsr相關的東西。
異常處理部分:
異常處理是同模式相關的乙個概念,arm有多種異常,對應不同的模式,但是他們之間不是一一對應的關係。
返回與否?
有些異常是不需要返回的,reset
其他的異常通常是需要返回到以前的狀態abort,但是不同的異常返回的點是不同的。通常異常的時候會儲存下乙個指令的位址到r14這樣,就需要在返回的時候更具需要進行調整你的pc。
,返回後通常執後的下一條指令這樣使用 movs就足夠了
abort,就需要返回出現問題的那條指令,也就是【r14】-4了,所以通常使用subs返回。
批量資料載入/儲存指令
arm微處理器所支援批量資料載入/儲存指令可以一次在一片連續的儲存器單元和多個暫存器之間傳送資料,批量載入指令用於將一片連續的儲存器中的資料傳送到多個暫存器,批量資料儲存指令則完成相反的操作。常用的載入儲存指令如下:
— ldm 批量資料載入指令
— stm 批量資料儲存指令
ldm(或stm)指令
ldm(或stm)指令的格式為:
ldm(或stm) 基址暫存器,暫存器列表
ldm(或stm)指令用於從由基址暫存器所指示的一片連續儲存器到暫存器列表所指示的多個暫存器之間傳送資料,該指令的常見用途是將多個暫存器的內容入棧或出棧。其中,為以下幾種情況:
ia 每次傳送後位址加1;
ib 每次傳送前位址加1;
da 每次傳送後位址減1;
db 每次傳送前位址減1;
fd 滿遞減堆疊;
ed 空遞減堆疊;
fa 滿遞增堆疊;
ea 空遞增堆疊;
為可選字尾,若選用該字尾,則當資料傳送完畢之後,將最後的位址寫入基址暫存器,否則基址暫存器的內容不改變。
基址暫存器不允許為r15,暫存器列表可以為r0~r15的任意組合。
為可選字尾,當指令為ldm且暫存器列表中包含r15,選用該字尾時表示:除了正常的資料傳送之外,還將spsr複製到cpsr。同時,該字尾還表示傳入或傳出的是使用者模式下的暫存器,而不是當前模式下的暫存器。
指令示例:
stmfd r13!,;將暫存器列表中的暫存器(r0,r4到r12,lr)存入堆疊。
ldmfd r13!,;將堆疊內容恢復到暫存器(r0,r4到r12,lr)。
ldr指令的格式為:
ldr 目的暫存器,《儲存器位址》
ldr指令用於從儲存器中將乙個32位的字資料傳送到目的暫存器中。該指令通常用於從儲存器中讀取32位的字資料到通用暫存器,然後對資料進行處理。當程式計數
器pc作為目的暫存器時,指令從儲存器中讀取的字資料被當作目的位址,從而可以實現程式流程的跳轉。該指令在程式設計中比較常用,且定址方式靈活多樣,請者認真掌握。
指令示例:
ldr r0,[r1] ;將儲存器位址為r1的字資料讀入暫存器r0。
ldr r0,[r1,r2] ;將儲存器位址為r1+r2的字資料讀入暫存器r0。
ldr r0,[r1,#8] ;將儲存器位址為r1+8的字資料讀入暫存器r0。
ldr r0,[r1,r2] !;將儲存器位址為r1+r2的字資料讀入暫存器r0,並將新位址r1+r2寫入r1。
ldr r0,[r1,#8] !;將儲存器位址為r1+8的字資料讀入暫存器r0,並將新位址r1+8寫入r1。
ldr r0,[r1],r2;將儲存器位址為r1的字資料讀入暫存器r0,並將新位址r1+r2寫入r1。
ldr r0,[r1,r2,lsl#2]!;將儲存器位址為r1+r2×4的字資料讀入暫存器r0,並將新位址r1+r2×4寫入r1。
ldr r0,[r1],r2,lsl#2;將儲存器位址為r1的字資料讀入暫存器r0,並將新位址r1+r2×4寫入r1。
mrs指令的格式為:
mrs 通用暫存器,程式狀態暫存器(cpsr或spsr)
mrs指令用於將程式狀態暫存器的內容傳送到通用暫存器中。該指令一般用在以下幾種情況:
-當需要改變程式狀態暫存器的內容時,可用mrs將程式狀態暫存器的內容讀入通用暫存器,修改後再寫回程式狀態暫存器。
-當在異常處理或程序切換時,需要儲存程式狀態暫存器的值,可先用該指令讀出程式狀態暫存器的值,然後儲存。
指令示例:
mrs r0,cpsr ;傳送cpsr的內容到r0
mrs r0,spsr ;傳送spsr的內容到r0
2、 msr指令
msr指令的格式為:
msr 程式狀態暫存器(cpsr或spsr)_《域》,運算元
msr指令用於將運算元的內容傳送到程式狀態暫存器的特定域中。其中,運算元可以為通用暫存器或立即數。《域》用於設定程式狀態暫存器中需要操作的位,32位的程式狀態暫存器可分為4個域:
位[31:24]為條件標誌位域,用f表示;
位[23:16]為狀態位域,用s表示;
位[15:8]為擴充套件位域,用x表示;
位[7:0]為控制位域,用c表示;
該指令通常用於恢復或改變程式狀態暫存器的內容,在使用時,一般要在msr指令中指明將要操作的域。
指令示例:
msr cpsr,r0 ;傳送r0的內容到cpsr
msr spsr,r0 ;傳送r0的內容到spsr
msr cpsr_c,r0;傳送r0的內容到spsr,但僅僅修改cpsr中的控制位域
arm微處理器所支援的異常指令有如下兩條:
— swi 軟體中斷指令
— bkpt 斷點中斷指令
1、swi指令
swi指令的格式為:
swi 24位的立即數
swi指令用於產生軟體中斷,以便使用者程式能呼叫作業系統的系統例程。作業系統在swi的異常處理程式中提供相應的系統服務,指令中24位的立即數指定使用者程式
呼叫系統例程的型別,相關引數通過通用暫存器傳遞,當指令中24位的立即數被忽略時,使用者程式呼叫系統例程的型別由通用暫存器r0的內容決定,同時,引數
通過其他通用暫存器傳遞。
指令示例:
swi 0x02 ;該指令呼叫作業系統編號位02的系統例程。
2、bkpt指令
bkpt指令的格式為:
bkpt 16位的立即數
bkpt指令產生軟體斷點中斷,可用於程式的除錯。3.4thumb指令及應用
為相容資料匯流排寬度為16位的應用系統,arm體系結構除了支援執行效率很高的32位arm指令集以外,同時支援16位的thumb指令集。thumb指令
集是arm指令集的乙個子集,允許指令編碼為16位的長度。與等價的32位**相比較,thumb指令集在保留32**優勢的同時,大大的節省了系統的存
儲空間。
所有的thumb指令都有對應的arm指令,而且thumb的程式設計模型也對應於arm的程式設計模型,在應用程式的編寫過程中,只要遵
循一定呼叫的規則,thumb子程式和arm子程式就可以互相呼叫。當處理器在執行arm程式段時,稱arm處理器處於arm工作狀態,當處理器在執行
thumb程式段時,稱arm處理器處於thumb工作狀態。
與arm指令集相比較,thumb指令集中的資料處理指令的運算元仍然是32
位,指令位址也為32位,但thumb指令集為實現16位的指令長度,捨棄了arm指令集的一些特性,如大多數的thumb指令是無條件執行的,而幾乎所
有的arm指令都是有條件執行的;大多數的thumb資料處理指令的目的暫存器與其中乙個源暫存器相同。
由於thumb指令的長度為16位,即只用arm指令一半的位數來實現同樣的功能,所以,要實現特定的程式功能,所需的thumb指令的條數較arm指令多。在一般的情況下,thumb指令與arm指令的時間效率和空間效率關係為:
— thumb**所需的儲存空間約為arm**的60%~70%
— thumb**使用的指令數比arm**多約30%~40%
— 若使用32位的儲存器,arm**比thumb**快約40%
— 若使用16位的儲存器,thumb**比arm**快約40%~50%
— 與arm**相比較,使用thumb**,儲存器的功耗會降低約30%
顯然,arm指令集和thumb指令集各有其優點,若對系統的效能有較高要求,應使用32位的儲存系統和arm指令集,若對系統的成本及功耗有較高要求,則應使用16位的儲存系統和thumb指令集。當然,若兩者結合使用,充分發揮其各自的優點,會取得更好的效果。
ARM堆疊及特殊指令
arm7支援四種堆疊模式 滿遞減 fd 滿遞增 fa 空遞減 ed 空遞增 ea fd 堆疊位址從上往下遞減,且指標指向最後乙個入棧元素。fa 堆疊位址從下往上遞增,且指標指向最後乙個入棧元素。ed 堆疊位址從上往下遞減,且指標指向下乙個可用空位。ea 堆疊位址從下網上遞增,且指標指向下乙個可用空位...
ARM指令裡幾個特殊符號
華清遠見嵌入式學院 講師。總結一下arm指令裡幾個特殊符號的意義 特殊符號 對應指令 含義 dcb 分配一片連續的位元組儲存單元並用指定的資料初始化 dcd 分配一片連續的字儲存單元並用指定的資料初始化 space 分配一片連續的儲存單元 map 定義乙個結構化記憶體表的首位址 filed 定義乙個...
ARM指令裡幾個特殊符號
總結一下 arm指令裡幾個特殊符號的意義 特殊符號 對應指令含義 dcb 分配一片連續的位元組儲存單元並用指定的資料初始化 dcd 分配一片連續的字儲存單元並用指定的資料初始化 space 分配一片連續的儲存單元 map 定義乙個結構化記憶體表的首位址 filed 定義乙個結構化記憶體表的資料域 經...