1ARM組合語言程式設計2ARM微處理器指令優點小晶片的面積低功耗ARM架構還採用了一些特別的技術,在性能的前提下儘量縮小晶片的面積,並降低功耗。條件式指令所有的指令都可根據前面的執行結果決定是否被執行,從而提高指令的執行效率。連續存取資料可用載入/存儲指令連續傳輸資料,以提高資料的傳輸效率。同時完成邏輯處理和移位元可在一條資料處理指令中同時完成邏輯處理和移位處理。自動增減迴圈在迴圈處理中使用位址的自動增減來提高執行效率。3ARM微處理器的指令ARM兩種指令集ARM指令為32位元的長度,Thumb指令為16位元長度。Thumb指令集為ARM指令集的功能子集,但與等價的ARM程式碼相比較,可節省30%~40%以上的存儲空間。4ARM處理器模式ARM架構支援7種處理器模式。模式改變在軟體控制下可以改變模式外部中斷或例外處理也可以引起模式發生改變。大多數應用程式在使用者模式下執行。當處理器工作在使用者模式時,正在執行的程式不能存取某些被保護的系統資源,也不能改變模式,除非例外(exception)發生。5ARM支援的7種工作模式處理器模式說明User(usr)正常程式執行模式FIQ(fiq)支援高速資料般移或通道處理IRQ(irq)用於通用中斷處理Supervisor(svc)作業系統保護模式Abortmode(abt)實現虛擬記憶體和/或記憶體保護Undefined(und)支援硬體輔助運算器的軟體仿真System(sys)執行特權作業系統工作6ARM微處理器的暫存器結構ARM處理器共有37個暫存器,被分為若干個組(BANK),這些暫存器包括:31個通用暫存器。包括程式計數器(PC指標)。6個程式狀態暫存器用以標識CPU的工作狀態及程式的執行狀態,均為32位元,目前只使用了其中的一部分。ARM處理器有7種不同的處理器模式在每一種處理器模式下均有一組相應的暫存器與之對應。7ARM暫存器1)不分組暫存器R0~R7R0~R7是不分組暫存器。這意味著在所有處理器模式下,它們每一個都存取一樣的32位元暫存器。它們是真正的通用暫存器,沒有架構所隱含的特殊用途。2)分組暫存器R8~R14R8~R14是分組暫存器。它們每一個存取的實體暫存器取決於當前的處理器模式。若要存取特定的實體暫存器而不依賴當前的處理器模式,則要使用規定的各字。暫存器R8~R12各有兩組實體暫存器:一組為FIQ模式,另一組為除了FIQ以外的所有模式。暫存器R8~R12沒有任何指定的特殊用途。只是使用R8~R14來簡單地處理中斷。暫存器R13,R14各有6個分組的實體暫存器。1個用於使用者模式和系統模式,其他5個分別用於5種例外模式。暫存器R13通常用做堆疊指標,稱為SP(StackPointer),每種例外模式都有自己的R13。暫存器R14用作副程式鏈結暫存器,也稱為LR(。3)程式計數器R15暫存器R15用做程式計數器(PC)。8ARM暫存器9程式狀態暫存器(ProgramStatusRegister)有一個CurrentProgramStatusRegister(CPSR)在所有處理器模式下都可以存取當前的程式狀態暫存器CPSR。CPSR包含條件碼旗標,中斷禁止位元,當前處理器模式以及其他狀態和控制資訊。有五個SavedProgramStatusRegisters(SPSRs)每種例外模式都有一個程式狀態保存暫存器SPSR。SPSR用於保留CPSR的狀態。10程式狀態暫存器條件碼旗標:N,Z,C,V大多數指令可以測試這些條件碼旗標以決定程式指令如何執行控制位元:最低8位元I,F,T和M位元用做控制位元。當例外出現時改變控制位元。當處理器在特權模式下也可以由軟體改變。中斷禁止位元:I置1則禁止IRQ中斷。F置1則禁止FIQ中斷。T位元:T=0指示ARM執行。T=1指示Thumb執行。在這些架構系統中,可自由地使用能在ARM和Thumb狀態之間切換的指令。模式位元:M0,M1,M2,M3和M4(M[4:0])是模式位元.這些位元決定處理器的工作模式。11PSRMode位元與可使用暫存器12ARM和Thumb之間狀態的切換ARM處理器可在兩種工作狀態之間切換。在Thumb狀態下,程式計數器PC使用位元1選擇另一個半字。ARM和Thumb之間狀態的切換不影響處理器的模式或暫存器的內容。進入Thumb狀態。當運算元暫存器的狀態位元0為1時,執行BX指令進入Thumb狀態。如果處理器在Thumb狀態進入例外,則當例外處理(IRQ,FIQ,Undef,Abort和SWI)返回時,自動切換到Thumb狀態。當運算元暫存器的狀態位元0為0時,執行BX指令進入ARM狀態。處理器進行例外處理(IRQ,FIQ,Undef,Abort和SWI),從例外向量位址開始執行也可以進入ARM狀態。13Thumb指令及應用Thumb指令集是ARM指令集的一個子集,允許指令編碼為16位元的長度。Thumb指令集在保留32程式碼優勢的同時,大大的節省了系統的存儲空間。大多數的Thumb指令是無條件執行的。大多數的Thumb資料處理指令的目的暫存器與其中一個來原暫存器相同。Thumb指令與ARM指令的時間效率和空間效率關係為:Thumb程式碼所需的存儲空間約為ARM程式碼的60%~70%Thumb程式碼使用的指令數比ARM程式碼多約30%~40%若使用32位的記憶體,ARM程式碼比Thumb程式碼快約40%若使用16位的記憶體,Thumb程式碼比ARM程式碼快約40%~50%與ARM程式碼相比較,使用Thumb程式碼,記憶體的功耗會降低約30%若對系統的性能有較高要求,應使用32位元的存儲系統和ARM指令集。若對系統的成本及功耗有較高要求,則應使用16位元的存儲系統和Thumb指令集。14Thumb與ARM和暫存器的比較R0R1R2R3R4R5R6R7SPLRPCCPSRSPSRR0R1R2R3R4R5R6R7R8R9R10R11R12SP(R13)LR(R14)PC(R15)CPSRSPSR高暫存器Thumb狀態ARM狀態低暫存器15Thumb狀態的暫存器集Thumb狀態下的暫存器集是ARM狀態下暫存器集的子集。程式師可以直接存取8個通用的暫存器(R0~R7),PC,SP,LR和CPSP。每一種特權模式都有一組SP,LR和SPSR。Thumb狀態的R0~R7與ARM狀態的R0~R7是一致的。Thumb狀態的CPSR和SPSR與ARM狀態的CPSR和SPSR是一致的。Thumb狀態的SP映射到ARM狀態的R13。Thumb狀態的LR映射到ARM狀態的R14。Thumb狀態的PC映射到ARM狀態的PC(R15)。16Thumb暫存器17ARM記憶體格式BIG-ENDIANLITTLE-ENDIAN18ARM指令格式(InstructionFormat)及種類19ARM指令及功能描述助記符指令功能描述ADC帶進位元加法指令ADD加法指令AND邏輯與指令B跳移指令BIC位元清零指令BL帶返回的跳移指令BLX帶返回和狀態切換的跳移指令BX帶狀態切換的跳移指令CDP輔助運算器資料操作指令CMN比較反值指令CMP比較指令EOR互斥指令LDC記憶體到輔助運算器的資料傳輸指令LDM載入多個暫存器指令LDR記憶體到暫存器的資料傳輸指令MCR從ARM暫存器到輔助運算器暫存器的資料傳輸指令MLA乘加運算指令MOV資料般移指令20ARM指令及功能描述助記符指令功能描述MRC從輔助運算器暫存器到ARM暫存器的資料傳輸指令MRS般移CPSR或SPSR的內容到通用暫存器指令MSR般移通用暫存器到CPSR或SPSR的指令MUL32位元乘法指令MLA32位元乘加指令MVN資料取反般移指令ORR邏輯或指令RSB逆向減法指令RSC帶借位的逆向減法指令SBC帶借位減法指令STC輔助運算器暫存器寫入記憶體指令STM連續記憶體字寫入指令STR暫存器到記憶體的資料傳輸指令SUB減法指令SWI軟體中斷指令SWP交換指令TEQ相等測試指令TST位元測試指令21指令的條件碼條件碼助記符尾碼旗標含義0000EQZ置位相等0001NEZ清零不相等0010CSC置位無符號數大於或等於0011CCC清零無符號數小於0100MIN置位負數0101PLN清零正數或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位Z清零無符號數大於1001LSC清零Z置位無符號數小於或等於1010GEN等於V帶符號數大於或等於1011LTN不等於V帶符號數小於1100GTZ清零且(N等於V)帶符號數大於1101LEZ置位或(N不等於V)帶符號數小於或等於1110AL忽略無條件執行22ARM指令的定址方式立即定址(ImmediateAddressing)暫存器定址(RegisterAddressing)暫存器間接定址(RegisterIndirectAddressing)基址變址定址(IndexAddressing)多暫存器定址(MultipleRegisterAddressing)堆疊定址(StackAddressing)23ARM指令的定址方式-立即定址立即定址也叫立即數定址,這是一種特殊的定址方式,運算元本身就在指令中給出,只要取出指令也就取到了運算元。這個運算元被稱為立即數,對應的定址方式也就叫做立即定址。例如以下指令:在以上兩條指令中,第二個源運算元即為立即數,要求以“#”為首碼,對於以十六進位表示的立即數,還要求在“#”後加上“0x”或“&”。ADDR0,R0,#1;R0←R0+1ADDR0,R0,#0x3f;R0←R0+0x3f24ARM指令的定址方式-暫存器定址暫存器定址就是利用暫存器中的數值作為運算元,這種定址方式是各類微處理器經常採用的一種方式,也是一種執行效率較高的定址方式。以下指令:該指令的執行效果是將暫存器R1和R2的內容相加,其結果存放在暫存器R0中。ADDR0,R1,R2;R0←R1+R225ARM指令的定址方式-暫存器間接定址暫存器間接定址就是以暫存器中的值作為運算元的位址,而運算元本身存放在記憶體中。例如以下指令:第一條指令將以R1的值為位址的記憶體中的資料般移到R0中。第二條指令將R0的值般移到以R1的值為位址的記憶體中。LDRR0,[R1];R0←[R1]STRR0,[R1];[R1]←R026ARM指令的定址方式-基址變址定址基址變址定址就是將暫存器(該暫存器一般稱作基址暫存器)的內容與指令中給出的位址偏移量相加,從而得到一個運算元的有效位址。變址定址方式常用於存取某基底位址附近的位址單元。採用變址定址方式的指令常見有以下幾種形式,如下所示:在第一條指令中,將暫存器R1的內容加上4形成運算元的有效位址,從而取得運算元存入暫存器R0中。在第二條指令中,將暫存器R1的內容加上4形成運算元的有效位址,從而取得運算元存入暫存器R0中,然後,R1的內容自增4個位元組。在第三條指令中,以暫存器R1的內容作為運算元的有效位址,從而取得運算元存入暫存器R0中,然後,R1的內容自增4個位元組。在第四條指令中,將暫存器R1的內容加上暫存器R2的內容形成運算元的有效位址,從而取得運算元存入暫存器R0中。LDRR0,[R1,#4];R0←[R1+4]LDRR0,[R1,#4]!;R0←[R1+4]、R1←R1+4LDRR0,[R1],#4;R0←[R1]、R1←R1+4LDRR0,[R1,R2];R0←[R1+R2]27ARM指令的定址方式-多暫存器定址採用多暫存器定址方式,一條指令可以完成多個暫存器值的般移。這種定址方式可以用一條指令完成般移最多16個通用暫存器的值。以下指令:該指令的尾碼IA表示在每次執行完載入/存儲操作後,R0按字長度增加,因此,指令可將連續存儲單元的值般移到R1~R4。LDMIAR0,{R1,R2,R3,R4};R1←[R0