ARM體系結構與程式設計 3

2021-06-22 10:53:07 字數 2778 閱讀 2707

arm儲存系統:

arm中用於儲存管理的系統控制協處理器cp15:

包含16個32位暫存器,其編號為0到15。實際上對於某些編號的暫存器可能對應有多個物理暫存器。

訪問cp15暫存器的指令:mrc、mcr。

cp15中的暫存器c0和c1:c0中存放arm相關的一些標示符;c1是乙個控制暫存器,用於禁止/使能mmu、配置儲存系統等。

例如下面的**串行使能mmu:

mrc p15,0,r0,c1,0,0

orr r0,#01

mcr p15,0,r0,c1,0,0

arm中的儲存管理單元mmu:

完成虛擬儲存空間到物理儲存空間的位址對映,和儲存器訪問許可權的控制,設定虛擬儲存空間的緩衝特性。

arm中的cache及write buffer技術:

快取記憶體和寫緩衝區位於主儲存器sdram和cpu之間,用來提高儲存系統的效能。

快速程序上下文切換技術:

通過修改系統中不同程序的虛擬位址,避免在進行程序間切換時造成的虛擬位址到實體地址的重對映,從而提高系統的效能。

atpcs:arm thumb procedure call standard:arm程式和thumb程式中的子程式呼叫的基本規則

為適應特定的需要,除去基本的atpcs外,有特定的atpcs,如支援資料棧限制檢查的atpcs、支援唯讀段位置無關的atpcs、支援可讀寫段位置無關的atpcs、支援arm和thumb程式混合使用的atpcs、處理浮點運算的atpcs。

基本的atpcs:

暫存器的使用規則:

子程式通過r0 - r3來傳遞引數,r0 - r3可記作a0 - a3。被呼叫的子程式在返回前無需恢復暫存器r0 - r3的內容。

在子程式中,使用r4 - r11來儲存區域性變數,r0 - r3可記作v1 - v8。如果在子程式中使用了v1 - v8中的某些暫存器,則子程式在進入時必須儲存這些暫存器的值,在返回前必須恢復這些暫存器的值。

r12可記作ip,用作子程式間scratch暫存器。

r13可記作sp,用作資料棧指標。sp在進入子程式時的值和退出子程式時的值必須相等。

r14可記作lr,稱為連線暫存器,用於儲存子程式的返回位址。

r15可記作pc,稱為程式計數器。

資料棧的使用規則:

棧指標可以指向不同的位置。當棧指標指向棧頂元素時,稱為滿棧。當棧指標指向與棧頂相鄰的下個可用資料單元時,稱為空棧。當資料棧向記憶體位址減小的方向增長時,稱為遞減棧。當資料棧向記憶體位址增加的方向增長時,稱為遞增棧。綜合起來有4中資料棧:fd(滿遞減)、ed(空遞減)、fa(滿遞增)、ea(空遞增)。atpcs規定資料棧為fd(滿遞減)型別,並且對資料棧的操作是8位元組對齊的。

引數傳遞規則:

引數個數可變的子程式引數傳遞規則:引數個數不超過4個時,使用r0 - r3來傳遞引數;引數個數超過4個時,可以使用資料棧來傳遞引數。

子程式結果返回規則:結果為乙個32位整數時,通過r0返回;結果為64位整數時,通過r0,r1來返回。、

c/c++以及組合語言的混合程式設計:

內嵌彙編器指的是包含在c/c++編譯器中的彙編器,它可以彙編內嵌的彙編指令。

內嵌的彙編指令用法:

運算元:作為運算元的暫存器和常量  可以是c/c++表示式。

物理暫存器:通常推薦在內嵌的彙編指令中不要指定物理暫存器,因為這可能會影響到編譯器對暫存器的分配,進而影響**的效率。

標號:內嵌的彙編指令中只有b指令可以使用c/c++程式中的標號。

在c/c++程式中使用內嵌的彙編指令的語法格式:

在arm c語言中:

__asm

在arm c++語言中:

asm("instruction [;instruction]");

從匯程式設計序中訪問c程式中宣告的全域性變數:

首先,使用import偽操作宣告該全域性變數

其次,使用ldr指令讀取該全域性變數的記憶體位址

最後,根據資料的型別使用相應的ldr指令讀取該全域性變數的值,使用str指令修改該全域性變數的值

匯程式設計序、c程式以及c++程式的相互呼叫:

在c++程式中使用c程式標頭檔案:

在c++程式中使用c程式的系統標頭檔案:直接包含。因為系統已經執行過了extern "c" {}的偽操作。

在c++程式中使用c程式的使用者自定義標頭檔案:

方法1:將其放在 extern "c" {} 中。例如:

//c++ code

extern "c"

方法2:在該c程式標頭檔案中使用extern "c" {}。例如:

//c header file

#ifdef __cplusplus

extern "c"

#endif

c程式呼叫匯程式設計序:

首先,匯程式設計序的設計要遵循atpcs規則,保證程式呼叫時引數的正確傳遞。

其次,在匯程式設計序中使用export偽操作宣告本程式標號,使得本程式可以被別的程式呼叫。

最後,在c語言程式中使用extern關鍵字宣告該匯程式設計序標號,然後就可以呼叫了。

匯程式設計序呼叫c程式:

首先,匯程式設計序的設計要遵循atpcs規則,保證程式呼叫時引數的正確傳遞。

最後,在匯程式設計序中使用import偽操作宣告將要呼叫的c程式,然後就可以呼叫了。

c++程式呼叫c程式:在c++程式中用關鍵字 extern "c" 宣告被呼叫的c程式。

匯程式設計序呼叫c++程式:

首先,匯程式設計序的設計要遵循atpcs規則,保證程式呼叫時引數的正確傳遞。

其次,在c++程式中使用extern "c" 宣告被呼叫的c++程式。

最後,在匯程式設計序中使用import偽操作宣告將要呼叫的c++程式,然後就可以呼叫了。

ARM體系結構與程式設計

arm處理器的7中執行模式 usr fiq irq svc abt und sys。arm處理器共37個暫存器 31個通用暫存器 未備份暫存器r0 r7,在全部模式下指的都是同乙個物理暫存器 備份暫存器r8 r12,每乙個暫存器相應兩個不同的物理暫存器。對於r13 sp 和r14 lr 來說,每乙個...

ARM體系結構與程式設計 1

arm處理器的7中執行模式 usr fiq irq svc abt und sys。arm處理器共37個暫存器 31個通用暫存器 未備份暫存器r0 r7,在所有模式下指的都是同乙個物理暫存器 備份暫存器r8 r12,每個暫存器對應兩個不同的物理暫存器。對於r13 sp 和r14 lr 來說,每個暫存...

ARM體系結構與程式設計 2

arm組合語言程式設計 arm組合語言源程式中的語句由指令 偽操作和巨集指令組成。arm指令已經在上一節介紹過了。arm偽操作和巨集指令分類 1 符號定義偽操作 gbla 宣告乙個全域性的算術變數,並將其初始化為0。語法 gbla variable gbll 宣告乙個全域性的邏輯變數,並將其初始化為...