1. 程式人生 > >ARM組合語言指令(2)

ARM組合語言指令(2)

  •   程式跳轉 >
(1)簡單的無條件轉移unconditional branch             B Next;     調轉到Next (2)有條件跳轉 MOV R0, #20           Next                    SUBS R0, R0, #1                    BNE Next 注意在IAR編輯器中,標號的起始位置在最左端,不能留空格。 (3)帶連結轉移(相當於子程式呼叫)                  BL Next;     branch to “Next” with link 在這種情況下用r14來儲存r15的值,然後跳轉到子程式處                  [r14] ← [PC];
                 [PC] ← Next 例如                   BL TESTBL                   continue          TESTBL                   MOV PC, LR 總結跳轉如下: 跳轉指令實現程式流程的跳轉,ARM程式實現跳轉的方法有: 使用專門的跳轉指令 直接向程式計數器PC寫入跳移位址值 通過向程式計數器PC寫入跳轉位址值,可實現4GB位址空間的跳轉,結合MOV LR, PC等可儲存返回位址值。ARM指令集中的跳轉指令可以完成從當前指令向前或向後的32MB的位址空間的轉移。         B{
條件}           目標位址 B指令是簡單的跳轉指令,儲存在轉移指令中的實際值是相對當前PC值的一個偏移量,而不是絕對地址。為24位有符號數,左移2位後有符號擴充為32位,表示有效偏移為26位(前後32MB空間)         BL{條件}         目標位址 BL是帶連結的跳轉,暫存器r14儲存PC的當前內容,可通過將r14內容重新載入PC而返回。類似於子程式呼叫。           BLX   目標位址 BLX指令從ARM指令集跳轉到指令中所指定的目標位址,並將處理器的工作狀態從ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容儲存在r14中。當使用者使用ARM指令集而副程式使用Thumb指令集時,可通過BLX實現副程式的使用和處理器工作狀態的切換。            BX{
條件}    目標位址 BX指令跳轉到指令所指定的目標位址,目標位址的指令既可以是ARM指令,也可以是Thumb指令。  
  • 資料般移指令
從一個暫存器般移到另一個暫存器        MOV  r0, #0                            ;[r0] ← 0, clear r0      MOV  r0, r1, LSL #4               ;[r0] ← [r1] *16      MOVNE r3, r2, ASR #5       ;IF Z=0 THEN [r3] ← [r2]/32      MOVS r0, r1, LSL #4           ;[r0] ← [r1] *16, update     MVN r0, #0                           ;[r0] -1; then 1’s complement of 0 is 111…11     MVN r0, r0                            ;[r0] [r0], complement the bits of r0     MVN r0, #0xF                       ;[r0] 0xFFFFFFF0     LDR r0, [r1]     STR r2, [r3]     LDR r0, [r1, #8]                    ;effective address = [r1]+8, r1 is unchanged     LDR r0, [r1, #8]!                   ;effective address = [r1]+8, [r1] [r1]+8     LDR r0, [r1],#8                     ;effective address = [r1], [r1] [r1]+8   常見操作舉例:   向量乘      s=A∙B=a1∙b1+a2∙b2+…+an∙bn MOV r4, #0              ;累加器清零 MOV r5, #24            ;向量長度為24 ADR r0, A                ; r0指向向量A的地址 ADR r1, B                ; r1指向向量B的地址 Next LDR r2, [r0], #4 LDR r3, [r1], #4 MLA r4, r2, r3, r4     ;r4 = r4 + r2*r3,為乘加指令 SUBS r5, r5,#1          ;decrement loop counter BNE Next 字串比較:比較兩個16-byte的串         ADR r0, String1         ADR r1, String2         LDMIA r0, {r2-r5}    ;get first 16-byte string in r2 to r5, 採用多暫存器定址方                                            ;,一條指令可以完成多個暫存器值的般移         LDMIA r1, {r6-r9}           CMP r2, r6         CMPEQ r3, r7         CMPEQ r4, r8         CMPEQ r5, r9          BEQ Equal                  ;if final 4 same then strings are equal NotEq           ….                              ;if end here then string not same Equal           … 堆疊是一種資料結構,按後進先出(First In Last Out, FILO)的方式工作,使用一個稱為堆疊指標的專用暫存器指示當前的操作位置,堆疊指標(SP,Stack Pointer)總是指向堆疊頂。當堆疊指標指向最後壓入堆疊的資料時,稱為滿堆疊(Full Stack),而當堆疊指標指向下一個將要存放資料的空位置時,稱為空堆疊(Empty Stack)。根據堆疊的生成方式,分為遞增堆疊(Ascending Stack)和遞減堆疊(Descending Stack),當堆疊由低位向高位址生成時,稱為遞增堆疊;當堆疊由高位址向低位址生成時,稱為遞減堆疊。組合起來,一共有滿遞增堆疊,滿遞減堆疊,空遞增堆疊和空遞減堆疊。 子程式呼叫 SUB1         …         STMFD r13, (r0-r4, lr)          ;儲存working registers and link register BL SUB2         LDMFD r13, (r0-r4, pc)               ;restore working registers and return        … SUB2          …          MOV pc, lr                                   ; return (copy link register to PC)  子程式呼叫通過帶連結的分支指令BL實現,其返回地址儲存在R14(LR)中,如果子程式需要呼叫另外的一個子程式,則必須在R14(LR)被覆蓋之前,將其儲存在堆疊中。
  • 連續資料載入/儲存指令

   ARM微處理器支援連續資料的載入/儲存指令,可以一次將一片連續的記憶體單元和多個暫存器之間般移資料。連續載入指令用於將一片連續的記憶體中的資料般移到多個暫存器,連續資料儲存指令則完成相反的操作。

         LDM           連續資料載入指令          STM            連續資料儲存指令 語法:          LDM(STM) {條件}{型別}基址暫存器{!},暫存器列表{^} 該指令的常見用途是將多個暫存器的內容入堆疊或出堆疊。型別為非堆疊型定址或堆疊型定址。    非堆疊型定址方式有:         IA(Increment After) 基址暫存器在存取後才增加         IB(Increment Before)基址暫存器在存取前即增加         DA(Decrement After)基址暫存器在存取後才減少         DB(Decrement Before)基址暫存器在存取前即減少    堆疊型定址型別        FD(Full Descending) 滿遞減        FA(Full Ascending)滿遞增        ED(Empty Descending)空遞減        EA(Empty Ascending)空遞減 堆疊指令範例            STMFD R13!, {R0, R4-R12, LR} ;將暫存器列表中的暫存器存入堆疊       LDMFD R13!, {R0, R4-R12, PC};將堆疊內容恢復到暫存器 基址暫存器不允許為R15,暫存器列表可以為R0~R14的任意組合。{!}為可選尾碼,若選用該尾碼,則當資料般移完畢之後,將最後的地址寫入到基址暫存器。否則,基址暫存器的內容不改變。{^}為可選尾碼,當指令為LDM且暫存器列表包含R15時,選用該尾碼還表示除了正常的資料般移外,還將SPSR複製到CPSR;此外還表示傳染或傳出的是使用者模式下的暫存器,而不是當前模式下的暫存器。
  •   堆疊