《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業界動態 > ARM匯編指令合集

ARM匯編指令合集

2015-09-25
關鍵詞: ARM 匯編 程序流程

  ARM處理器的指令集可以分為跳轉指令、數據處理指令、程序狀態寄存器(PSR)處理指令、加載/存儲指令、協處理器指令和異常產生指令6大指令。
  一、跳轉指令
  跳轉指令用于實現程序流程的跳轉,在ARM程序中有以下兩種方法可以實現程序流程的跳轉。
  Ⅰ.使用專門的跳轉指令;
  Ⅱ.直接向程序計數器PC寫入跳轉地址值,通過向程序計數器PC寫入跳轉地址值,可以實現在4GB的地址空間中的任意跳轉,在跳轉之前結合使用MOV LR,PC等類似指令,可以保存將來的返回地址值,從而實現在4GB連續的線性地址空間的子程序調用。
  ARM指令集中的跳轉指令可以完成從當前指令向前或向后的32MB的地址空間的跳轉,包括以下4條指令:
  1、B指令
  B指令的格式為:
  B{條件} 目標地址
  B指令是最簡單的跳轉指令。一旦遇到一個B指令,ARM處理器將立即跳轉到給定的目標地址,從那里繼續執行。注意存儲在跳轉指令中的實際值是相對當前PC 值的一個偏移量,而不是一個絕對地址,它的值由匯編器來計算(參考尋址方式中的相對尋址)。它是24位有符號數,左移兩位后有符號擴展為32 位,表示的有效偏移為26 位(前后32MB的地址空間)。以下指令:
  B Label ;程序無條件跳轉到標號Label處執行
  CMP R1,#0 ;當CPSR寄存器中的Z條件碼置位時,程序跳轉到標號Label處執行
  BEQ Label
  2、BL指令
  BL指令的格式為:
  BL{條件} 目標地址
  BL是另一個跳轉指令,但跳轉之前,會在寄存器R14中保存PC的當前內容,因此,可以通過將R14的內容重新加載到PC中,來返回到跳轉指令之后的那個 指令處執行。該指令是實現子程序調用的一個基本但常用的手段。
  以 下指令:
  BL Label ;當程序無條件跳轉到標號Label處執行時,同時將當前的 PC值保存到
  ;R14(LR)中
  3、BLX指令
  BLX指令的格式為:
  BLX 目標地址
  BLX指令從ARM指令集跳轉到指令中所指定的目標地址,并將處理器的工作狀態有ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容保存到寄存 器R14中。因此,當子程序使用Thumb指令集,而調用者使用ARM指令集時,可以通過BLX指令實現子程序的調用和處理器工作狀態的切換。同時,子程 序的返回可以通過將寄存器R14值復制到PC中來完成。
  4、BX指令
  BX指令的格式為:
  BX{條件} 目標地址
  BX指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM指令,也可以是Thumb指令。
  二、數據處理指令
  數據處理指令可分為數據傳送指令、算術邏輯運算指令 和比較指令等。
  數據傳送指令用于在寄存器和存儲器之間進行數據的雙向傳輸;
  算術邏輯運算指令完成常用的算術與邏輯的運算,該類指令不但將運算結果保存在目的寄存器中,同時更新CPSR中的相應條件標志位;
  比較指令不保存運算結果,只更新CPSR中相應的條件標志位。
  數據處理指令共以下16條。
  1、MOV指令(傳送)
  MOV指令的格式為:
  MOV{條件}{S} 目的寄存器,源操作數
  MOV指令可完成從另一個寄存器、被移位的寄存器或將一個立即數加載到目的寄存器。其中S選項決定指令的操作是否影響CPSR中條件標志位的值,當沒有S 時指令不更新CPSR中條件標志位的值。
  指令示例:
  MOV R1,R0 ;將寄存器R0的值傳送到寄存器R1
  MOV PC,R14 ;將寄存器R14的值傳送到 PC,常用于子程序返回
  MOV R1,R0,LSL#3 ;將寄存器R0的值左移3位后傳送到R1
  2、MVN指令(求反)
  MVN指令的格式為:
  MVN{條件}{S} 目的寄存器,源操作數
  MVN指令可完成從另一個寄存器、被移位的寄存器、或將一個立即數加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值 傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值。
  指令示例:
  MVN R0,#0 ;將 立即數0取反傳送到寄存器R0中,完成后R0=-1
  3、CMP指令(比較)
  CMP指令的格式為:
  CMP{條件} 操作數1,操作數2
  CMP指令用于把一個寄存器的內容和另一個寄存器的內容或立即數進行比較,同時更新CPSR中條件標志位的值。該指令進行一次減法運算,但不存儲結果,只 更改條件標志位。 標志位表示的是操作數1與操作數2的關系(大、小、相等),例如,當操作數1大于操作操作數2,則此后的有GT后綴的指令將可以執行。
  指令示例:
  CMP R1,R0 ;將寄存器R1的值與寄存器R0的值相減,并根據 結果設置CPSR的標
  ;志位
  CMP R1,#100 ;將寄存器R1的值與立即數100相減,并根 據結果設置CPSR的標志位
  4、CMN指令(負數比較)
  CMN指令的格式為:
  CMN{條件} 操作數1,操作數2
  CMN指令用于把一個寄存器的內容和另一個寄存器的內容或立即數取反后進行比較,同時更新CPSR中條件標志位的值。該指令實際完成操作數1和操作數2相 加,并根據結果更改條件標志位。
  指令示例:
  CMN R1,R0 ;將寄存器R1的值與寄存器R0的值相加,并根據 結果設置CPSR
  ;的標志位
  CMN R1,#100 ;將寄存器R1的值與立即數100相加,并根據 結果設置CPSR的標志位
  5、TST指令(測試)
  TST指令的格式為:
  TST{條件} 操作數1,操作數2
  TST指令用于把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,并根據運算結果更新CPSR中條件標志位的值。操作數1是要測試的數 據,而操作數2是一個位掩碼,該指令一般用來檢測是否設置了特定的位。
  指令示例:
  TST R1,#%1 ;用于測試在寄存器R1中是否設置了最低位(%表 示二進制數)
  TST R1,#0xffe ;將寄存器R1的值與立即數0xffe按位與,并根據 結果設置CPSR
  ;的標志位
  6、TEQ指令(測試相等)
  TEQ指令的格式為:
  TEQ{條件} 操作數1,操作數2
  TEQ指令用于把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的異或運算,并根據運算結果更新CPSR中條件標志位的值。該指令通常用于比較操作數1和操作數2是否相等。
  指令示例:
  TEQ R1,R2 ;將寄存器R1的值與寄存器R2的值按位異或,并根據結果 設置CPSR
  ;的標志位
  7、ADD指令(相加)
  ADD指令的格式為:
  ADD{條件}{S} 目的寄存器,操作數1,操作數2
  ADD指令用于把兩個操作數相加,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。
  指令示例:
  ADD R0,R1,R2 ; R0 = R1 + R2
  ADD R0,R1,#256 ; R0 = R1 + 256
  ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)
  8、ADC指令(帶進位相加)
  ADC指令的格式為:
  ADC{條件}{S} 目的寄存器,操作數1,操作數2
  ADC指令用于把兩個操作數相加,再加上CPSR中的C條件標志位的值,并將結果存放到目的寄存器中。它使用一個進位標志位,這樣就可以做比32位大的數 的加法,注意不要忘記設置S后綴來更改進位標志。操作數1應是一個寄存器,操作數2可以是一 個寄存器,被移位的寄存器,或一個立即數。
  以下指令序列完成兩個128位數的加法,第一個數由高到低存放在寄存器R7~R4,第二個數由高到低存放在寄存器R11~R8,運算結果由高到低存放在寄 存器R3~R0:
  ADDS R0,R4,R8 ; 加低端的字
  ADCS R1,R5,R9 ; 加第二個字,帶進位
  ADCS R2,R6,R10 ; 加第三個字,帶進位
  ADC R3,R7,R11 ; 加第四個字,帶進位
  9、SUB指令(相減)
  SUB指令的格式為:
  SUB{條件}{S} 目的寄存器,操作數1,操作數2
  SUB指令用于把操作數1減去操作數2,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即 數。該指令可用于有符號數或無符號數的減法運算。
  指令示例:
  SUB R0,R1,R2 ; R0 = R1 - R2
  SUB R0,R1,#256 ; R0 = R1 - 256
  SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)
  10、~~~~C指令
  ~~~~C指令的格式為:
  ~~~~C{條件}{S} 目的寄存器,操作數1,操作數2
  ~~~~C指令用于把操作數1減去操作數2,再減去CPSR中的C條件標志位的反碼,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以 是一個寄存器,被移位的寄存器,或一個立即數。該指令使用進位標志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設置S后綴來更改進位標志。該指令可用于有符號數或無符號數的減法運算。
  指令示例:
  SUBS R0,R1,R2 ;R0 = R1 - R2 - !C,并根據結果設置CPSR的進位標志位
  11、R~~~~指令
  R~~~~指令的格式為:
  R~~~~{條件}{S} 目的寄存器,操作數1,操作數2
  R~~~~指令稱為逆向減法指令,用于把操作數2減去操作數1,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位 的寄存器,或一個立即數。該指令可用于有符號數或無符號數的減法運算。
  指令示例:
  R~~~~ R0,R1,R2 ; R0 = R2 – R1
  R~~~~ R0,R1,#256 ; R0 = 256 – R1
  R~~~~ R0,R2,R3,LSL#1 ; R0 = (R3 << 1) - R2
  12、RSC指令(反向帶進位減)
  RSC指令的格式為:
  RSC{條件}{S} 目的寄存器,操作數1,操作數2
  RSC指令用于把 操作數2減去操作數1,再減去CPSR中的C條件標志位的反碼,并將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位 的寄存器,或一個立即數。該指令使用進位標志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設置S后綴來更改進位標志。該指令可用于有符號數或 無符號數的減法運算。
  指令示例:
  RSC R0,R1,R2 ;R0 = R2 – R1 - !C
  13、AND指令(邏輯位 與)
  AND指令的格式為:
  AND{條件}{S} 目的寄存器,操作數1,操作數2
  AND指令用于在兩個操作數上進行邏輯與運算,并把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個 立即數。該指令常用于屏蔽操作數1的某些位。
  指令示例:
  AND R0,R0,#3 ;該指令保持R0的0、1位,其余位清零。
  14、ORR指令(邏輯位 或)
  ORR指令的格式為:
  ORR{條件}{S} 目的寄存器,操作數1,操作數2
  ORR指令用于在兩個操作數上進行邏輯或運算,并把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個 立即數。該指令常用于設置操作數1的某些位。
  指令示例:
  ORR R0,R0,#3 ;該指令設置R0的0、1位,其余位保持不變。
  15、EOR指令(邏輯位 異或)
  EOR指令的格式為:
  EOR{條件}{S} 目的寄存器,操作數1,操作數2
  EOR指令用于在兩個操作數上進行邏輯異或運算,并把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一 個立即數。該指令常用于反轉操作數1的某些位。
  指令示例:
  EOR R0,R0,#3 ;該指令反轉R0的0、1位,其余位保持不變。
  16、BIC指令(位清零)
  BIC指令的格式為:
  BIC{條件}{S} 目的寄存器,操作數1,操作數2
  BIC指令用于清除操作數1的某些位,并把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。 操作數2為32位的掩碼,如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位保持不 變。
  指令示例:
  BIC R0,R0,#%1011 ;該指令清除R0中的位 0、1、和 3,其余的位保持不變。
  三、乘法指令與乘加指令
  ARM 微處理器支持的乘法指令與乘加指令共有6條,可分為運算結果為32位和運算結果為64位兩類,與前面的數據處理指令不同,指令中的所有操作數、目的寄存器 必須為通用寄存器,不能對操作數使用立即數或被移位的寄存器,同時,目的寄存器和操作數1必須是不同的寄存器。
  乘法指令與乘加指令共有以下6條:
  1、MUL指令(相乘)
  MUL指令的格式為:
  MUL{條件}{S} 目的寄存器,操作數1,操作數2
  MUL指令完成將操作數1與操作數2的乘法運算,并把結果放置到目的寄存器中,同時可以根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操 作數2均為32位的有符號數或無符號數。
  指令示例:
  MUL R0,R1,R2 ;R0 = R1 × R2
  MULS R0,R1,R2 ;R0 = R1 × R2,同時設置CPSR中的相關條件標志位
  2、MLA指令(帶累加的相乘)
  MLA指令的格式為:
  MLA{條件}{S} 目的寄存器,操作數1,操作數2,操作數3
  MLA指令完成將操作數1與操作數2的乘法運算,再將乘積加上操作數3,并把結果放置到目的寄存器中,同時可以根據運算結果設置CPSR中相應的條件標志 位。其中,操作數1和操作數2均為32位的有符號數或無符號數。
  指令示例:
  MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3
  MLAS R0,R1,R2,R3 ;R0 = R1 × R2 + R3,同時設置CPSR中的相關條件標志位
  3、SMULL指令
  SMULL指令的格式為:
  SMULL{條件}{S} 目的寄存器Low,目的寄存器High,操作數1,操作數2
  SMULL指令完成將操作數1與操作數2的乘法運算,并把結果的低32位放置到目的寄存器Low中,結果的高32位放置到目的寄存器High中,同時可以 根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操作數2均為32位的有符號數。
  指令示例:
  SMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位
  ;R1 = (R2 × R3)的高32位
  4、SMLAL指令
  SMLAL指令的格式為:
  SMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數1,操作數2
  SMLAL指令完成將操作數1與操作數2的乘法運算,并把結果的 低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同 時可以根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操作數2均為32位的有符號數。
  對于目的寄存器Low,在指令執行前存放64位加數的低32位,指令執行后存放結果的低32位;對于目的寄存器High,在指令執行前存放64位加數的高32位,指令執行后存放結果的高32位。
  指令示例:
  SMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 + R0
  ;R1 = (R2 × R3)的高32位 + R1
  5、UMULL指令
  UMULL指令的格式為:
  UMULL{條件}{S} 目的寄存器Low,目的寄存器High,操作數1,操作數2
  UMULL指令完成將操作數1與操作數2的乘法運算,并把結果的低32位放置到目的寄存器Low中,結果的高32位放置到目的寄存器High中,同時可以 根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操作數2均為32位的無符號數。
  指令示例:
  UMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位
  ;R1 = (R2 × R3)的高32位
  6、UMLAL指令
  UMLAL指令的格式為:
  UMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數1,操作數2
  UMLAL指令完成將操作數1與操作數2的乘法運算,并把結果的 低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High 中,同 時可以根據運算結果設置CPSR中相應的條件標志位。其中,操作數1和操作數2均為32位的無符號數。
  對于目的寄存器Low,在指令執行前存放64位加數的低32位,指令執行后存放結果的低32位;對于目的寄存器High,在指令執行前存放64位加數的高32位,指令執行后存放結果的高32位。
  指令示例:
  UMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 + R0
  ;R1 = (R2 × R3)的高32位 + R1
  四、程序狀態寄存器訪問指令
  1、MRS指令
  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微處理器支持加載/存儲指令用于在寄存器和存儲器之間傳送數據,加載指令用于將存儲器中的數據傳送到寄存器,存儲 指令則完成相反的操作。常用的加載存儲指令如下:
  1、LDR指令
  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。
  2、LDRB指令
  LDRB指令的格式為:
  LDR{條件}B 目的寄存器,<存儲器地址>
  LDRB指令用于從存儲器中將一個8位的字節數據傳送到目的寄存器中,同時將寄存器的高24位清零。 該指令通常用于從存儲器中讀取8位的字節數據到通用寄存器,然后對數據進行處理。當程序計數器PC作為目的寄存器時,指令從存儲器中讀取的字數據被當作目 的地址,從而可以實現程序流程的跳轉。
  指令示例:
  LDRB R0,[R1] ;將存儲器地址為R1的字節數據讀入寄存器 R0,并將R0的高24
  ;位清零。
  LDRB R0,[R1,#8] ;將存儲器地址為R1+8的字節數據讀入寄存器R0,并將 R0的
  ;高24位清零。
  3、LDRH指令
  LDRH指令的格式為:
  LDR{條件}H 目的寄存器,<存儲器地址>
  LDRH指令用于從存儲器中將一個16位的半字數據傳送到目的寄存器中,同時將寄存器的高16位清零。 該指令通常用于從存儲器中讀取16位的半字數據到通用寄存器,然后對數據進行處理。當程序計數器PC作為目的寄存器時,指令從存儲器中讀取的字數據被當作 目的地址,從而可以實現程序流程的跳轉。
  指令示例:
  LDRH R0,[R1] ;將存儲器地址為R1的半字數據讀入寄存器 R0,并將R0的高
  ;16位清零。
  LDRH R0,[R1,#8] ;將存儲器地址為R1+8的半字數據讀入寄存器R0,并將R0 的
  ;高16位清零。
  LDRH R0,[R1,R2] ;將存儲器地址為R1+R2的半字數據讀入寄存器R0,并將 R0的
  ;高16位清零。
  4、STR指令
  STR指令的格式為:
  STR{條件} 源寄存器,<存儲器地址>
  STR指令用于從源寄存器中將一個32位的字數據傳送到存儲器中。 該指令在程序設計中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。
  指令示例:
  STR R0,[R1],#8 ;將R0中的字數據寫入以R1為地址的存儲器中,并 將新地址
  ;R1+8寫入R1。
  STR R0,[R1,#8] ;將R0中的字數據寫入以R1+8為地址的存儲器中。
  5、STRB指令
  STRB指令的格式為:
  STR{條件}B 源寄存器,<存儲器地址>
  STRB指令用于從源寄存器中將一個8位的字節數據傳送到存儲器中。該字節數據為源寄存器中的低8位。
  指令示例:
  STRB R0,[R1] ;將寄存器R0中的字節數據寫入以R1為地 址的存儲器中。
  STRB R0,[R1,#8] ;將寄存器R0中的字節數據寫入以R1+8為地址的存 儲器中。
  6、STRH指令
  STRH指令的格式為:
  STR{條件}H 源寄存器,<存儲器地址>
  STRH指令用于從源寄存器中將一個16位的半字數據傳送到存儲器中。該半字數據為源寄存器中的低16位。
  指令示例:
  STRH R0,[R1] ;將寄存器R0中的半字數據寫入以R1為地址的 存儲器中。
  STRH R0,[R1,#8] ;將寄存器R0中的半字數據寫入以R1+8 為地址的存儲器中。
  六、批量數據加載/存儲指令。
  ARM微處理器所支持批量數據加載/存儲指令可以一次在一片連續的存儲器單元和多個寄存器之間傳送數據,批量加載指令 用于將一片連續的存儲器中的數據傳送到多個寄存器,批量數據存儲指令則完成相反的操作。常用的加載存儲指令如下: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} ;將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧。
  LDMFD R13!, {R0,R4-R12,PC} ;將堆棧內容恢復到寄存器(R0,R4到R12,LR)。
  七、數據交換指令
  1、SWP指令
  SWP指令的格式為:
  SWP{條件} 目的寄存器,源寄存器1,[源寄存器2]
  SWP指令用于將源寄存器2所指向的存儲器中的字數據傳送到目的寄存器中,同時將源寄存器1中的字數據傳送到源寄存器2所指向的存儲器中。顯然,當源寄存 器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內容。
  指令示例:
  SWP R0,R1,[R2] ;將R2所指向的存儲器中的字數據傳送到R0,同時將R1 中的字數據傳送到R2所指向的存儲單元。
  SWP R0,R0,[R1] ;該指令完成將R1所指向的存儲器中的字數 據與R0中的數據交換。
  2、SWPB指令
  SWPB指令的格式為:
  SWP{條件}B 目的寄存器,源寄存器1,[源寄存器2]
  SWPB指令用于將源寄存器2所指向的存儲器中的字節數據傳送到目的寄存器中,目的寄存器的高24清零,同時將源寄存 器1中的字節數據傳送到源寄存器2所指向的存儲器中。顯然,當源寄存器1和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內容。
  指令示例:
  SWPB R0,R1,[R2] ;將R2所指向的存儲器中的字節數據傳送到 R0,R0的高24位清零,同時將R1中的低8位數據傳送到R2所指向的存儲單元。
  SWPB R0,R0,[R1] ;該指令完成將R1所指向的存儲器中的 字節數據與R0中的低8位數據交換。

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 亚洲无线码一区二区三区 | 欧美13一18成年性 | 日韩在线观看内窥镜 | 岛国免费v片在线播放 | 日韩美女免费线视频网址 | 久久久久国产一级毛片高清板 | 女人被男人扒开狂躁视频 | 日韩中文视频 | 免费人成在线观看视频播放 | 精品综合一区二区三区 | 91国内外精品自在线播放 | 日本国产黄色片 | 免费a级一片| 好男人社区成人影院在线观看 | 最近更新2019中文字幕国语 | 日本黄色片在线播放 | 日韩欧美一级大片 | 欧美在线观看黄色 | 情人边吃奶边做好爽嗷嗷叫 | 久草视频在线资源站 | 日本精品久久久免费高清 | 欧美人禽zozk伦交 | 老司机精品99在线播放 | 一级做a免费视频观看网站 一男一女下面一进一出性视频 | 99爱视频99爱在线观看免费 | 久久91精品国产91久 | 国产极品久久 | 国产专区青青草原亚洲 | 日韩欧美在线看 | 国产免费又爽又黄又刺激的视频 | 成人精品一区二区三区校园激情 | 又黄又爽又成人免费视频 | 成人国产一区二区三区 | 亚州免费视频 | 免费在线观看的毛片 | 日本黄大片 在线播放 | 国产dvd毛片在线视频 | 2020最新国产精品视频 | 国产偷国产偷高清视频 | 国产丝袜在线播放 | 中文字幕日本在线 |