日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARM指令集

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM指令集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ARM指令的基本格式

?? ?ARM指令的基本格式為:
?? ?<Opcode> {<Cond>} {S} <Rd>, <Rn> { , <Opcode2> }
?? ?
?? ?其中,<>內的項是必需的,{}內的項是可選的。
?? ?
?? ?1)Opcode項
?? ?Opcode是指令助記符,即操作碼,說明指令需要執行的操作,在指令中是必需的。
?? ?
?? ?2)Cond項(command)
?? ?Cond項表明了指令的執行的條件,每一條ARM指令都可以在規定的條件下執行,每條ARM指令包含4位的條件碼,位于指令的最高4位[31:28]。
?? ?條件碼共有16種,每種條件碼用2個字符表示,這兩個字符可以添加至指令助記符的后面,與指令同時使用。
?? ?當指令的執行條件滿足時,指令才被執行,否則指令被忽略。如果在指令后不寫條件碼,則使用默認條件AL(無條件執行)。
?? ?
?? ??? ??? ??? ??? ??? ?指令的條件碼
?? ?
?? ?條 件 碼?? ??? ??? ?助記符后綴?? ??? ??? ?標??? 志?? ??? ??? ??? ?含??? 義
?? ?0000?? ??? ??? ?EQ?? ??? ??? ??? ??? ?Z置位?? ??? ??? ??? ?相等equal
?? ?0001?? ??? ??? ?NE?? ??? ??? ??? ??? ?Z清零?? ??? ??? ??? ?不相等not equal
?? ?0010?? ??? ??? ?CS?? ??? ??? ??? ??? ?C置位?? ??? ??? ??? ?無符號數大于或等于Carry Set
?? ?0011?? ??? ??? ?CC?? ??? ??? ??? ??? ?C清零?? ??? ??? ??? ?無符號數小于
?? ?0100?? ??? ??? ?MI?? ??? ??? ??? ??? ?N置位?? ??? ??? ??? ?負數minus
?? ?0101?? ??? ??? ?PL?? ??? ??? ??? ??? ?N清零?? ??? ??? ??? ?正數或零plus
?? ?0110?? ??? ??? ?VS?? ??? ??? ??? ??? ?V置位?? ??? ??? ??? ?溢出
?? ?0111?? ??? ??? ?VC?? ??? ??? ??? ??? ?V清零?? ??? ??? ??? ?沒有溢出
?? ?1000?? ??? ??? ?HI?? ??? ??? ??? ??? ?C置位Z清零?? ??? ??? 無符號數大于high
?? ?1001?? ??? ??? ?LS?? ??? ??? ??? ??? ?Z置位C清零?? ??? ??? 無符號數小于或等于less
?? ?1010?? ??? ??? ?GE?? ??? ??? ??? ??? ?N等于V?? ??? ??? ??? 帶符號數大于或等于
?? ?1011?? ??? ??? ?LT?? ??? ??? ??? ??? ?N不等于V?? ??? ??? ? 帶符號數小于least
?? ?1100?? ??? ??? ?GT?? ??? ??? ??? ??? ?Z清零且(N等于V)?? ?帶符號數大于great
?? ?1101?? ??? ??? ?LE?? ??? ??? ??? ??? ?Z清零或(N不等于V)? 帶符號數小于或等于
?? ?1110?? ??? ??? ?AL?? ??? ??? ??? ??? ?忽略?? ??? ??? ??? ? 無條件執行all
?? ?1111
?? ?
?? ?
?? ?
?? ?條件碼應用舉例:
?? ?例:比較兩個值大小,并進行相應加1處理,C語言代碼為:
?? ?if? ( a > b )? a++;
?? ?else? b++;
?? ?
?? ?對應的ARM指令如下(其中R0中保存a 的值,R1中保存b的值):
?? ?CMP? R0, R1? ; R0與R1比較,做R0-R1的操作
?? ?ADDHI? R0, R0, #1? ;若R0 > R1, 則R0 = R0 + 1
?? ?ADDLS? R1, R1, #1? ; 若R0 <= R1, 則R1 = R1 + 1
?? ?
?? ?CMP比較指令,用于把一個寄存器的內容和另一個寄存器的內容或一個立即數進行比較,同時更新CPSR中條件標志位的值。指令將第一操作數減去第二操作數,但不存儲結果,只更改條件標志位。
?? ?CMP? R1, R0? ;做R1-R0的操作。
?? ?CMP? R1,#10? ;做R1-10的操作。
?? ?
?? ?3)S項(sign)
?? ?S項是條件碼設置項,它決定本次指令執行的結果是否影響至CPSR寄存器的相應狀態位的值。該項是可選的,使用時影響CPSR,否則不影響CPSR。
?? ?
?? ?4)Rd項(destination)
?? ?Rd是指令中的目標寄存器,它是必需的。根據指令的不同,有些指令中要求Rd必須有R0~R7之間,有些要求Rd必須在R0~R14之間,有些則沒有特殊要求。
?? ?
?? ?5)Rn項
?? ?Rn是第一個操作數的寄存器,和Rd一樣,不同的指令對其的使用有不同的要求。
?? ?
?? ?6)Opcode2項
?? ?Opcode2項是第二個操作數,在ARM指令中,該操作數有三種形式:立即數形式、寄存器Rm形式和寄存器加移位形式(Rm, shift)。
?? ?
?? ?SUB? R3,? R1,? #10
?? ?SUB? R3,? R1,? R2
?? ?SUB? R3,? R1,? R2,? LSL? #2
?? ?SUB? R3,? R1,? R2,? LSL? R0


ARM指令詳解

ARM指令集可分為以下6類:
1.跳轉指令
2.數據處理指令
3.程序狀態寄存器(PSR)處理指令
4.加載/存儲指令
5.協處理器指令
6.異常產生指令

一、跳轉指令
?? ?用于實現程序流程的跳轉,在ARM程序中有兩種方法可以實現程序流程的跳轉:
?? ?1)、是使用專門的跳轉指令,
?? ?2)、是直接向程序計數器PC寫入跳轉地址值。
?? ?
?? ?第二種方法可以實現在4GB的地址空間中的任意跳轉,
?? ?在跳轉之前結合使用 MOV LR , PC 等類似指令,可以保存將來的返回地址值,
?? ?從而實現在4GB連續的線性地址空間的子程序調用。
?? ?
?? ?ARM指令集中的跳轉指令可以完成從當前指令向前或向后的32MB的地址空間的跳轉,包括以下4條指令:
?? ?B 跳轉指令
?? ?BL 帶返回的跳轉指令
?? ?BX 帶狀態切換的跳轉指令
?? ?BLX 帶返回和狀態切換的跳轉指令
?? ?
?? ?
?? ?B 指令的格式為:
?? ?B{條件} 目標地址
?? ?
?? ?B指令是最簡單的跳轉指令。一旦遇到一個B 指令,ARM 處理器將立即跳轉到給定的目標地址,從那里繼續執行。
?? ?B Label程序無條件跳轉到標號Label處執行
?? ?CMP R1, #0
?? ?BEQ Label
?? ?當CPSR寄存器中的Z條件碼置位時,程序跳轉到標號Label處執行。
?? ?
?? ?
?? ?BL指令的格式為:
?? ?BL{條件} 目標地址
?? ?
?? ?BL 是另一個跳轉指令,但跳轉之前,會在寄存器R14中保存PC當前值,因此,可以通過將R14 的內容重新加載到PC中,
?? ?來返回到跳轉指令之后的那個指令處執行。該指令是實現子程序調用的一個基本但常用的手段。
?? ?BL Label 當程序無條件跳轉到標號Label處執行時,同時將當前的PC值保存到R14中
?? ?
?? ?
?? ?BX指令的格式為:
?? ?BX{條件} 目標地址
?? ?
?? ?BX指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM指令,也可以是Thumb指令。
?? ?BX指令中所指定的目標地址,只能使用寄存器的尋址方式,即跳轉的目標地址應先保存在一個寄存器中。
?? ?指令在實現跳轉的同時,完成處理器的工作狀態的切換(ARM狀態與Thumb狀態間的切換)。
?? ?BX指令中,用寄存器的最低位來指示切換到哪一個工作狀態。
?? ?如寄存器最低位為1,則把目標地址處的代碼解釋為Thumb代碼,進入Thumb工作狀態,并自動將CPSR中的控制位T置1。
?? ?若寄存器最低位為0,則把目標地址處的代碼解釋為ARM代碼,進入ARM工作狀態,并自動將CPSR中的控制位T置0。
?? ?
?? ?
?? ?BLX指令的格式為:
?? ?BLX 目標地址
?? ?
?? ?BLX指令 從ARM指令集跳轉到指令中所指定的目標地址,并將處理器的工作狀態有ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容保存到寄存器R14中。
?? ?因此,當子程序使用Thumb指令集,而調用者使用ARM指令集時,可以通過BLX指令實現子程序的調用和處理器工作狀態的切換。
?? ?同時,子程序的返回可以通過將寄存器R14值復制到PC中來完成。
?? ?
?? ?ADRL? R0,? ThumbFun + 1???? ;生成分支地址并置最低位為 1
?? ?
?? ?BX? R0? ??? ??? ??? ??? ??? ?;跳轉到R0所指定的地址,并切換處理器到Thumb工作狀態
?? ?
?? ?...
?? ?
?? ?ThumbFun ?
?? ?
?? ?...???? ??? ??? ??? ??? ??? ?;Thumb匯編指令
?? ?
?? ?
?? ?
二、數據處理指令

?? ?數據處理指令可分為數據傳送指令、算術邏輯運算指令、比較指令等。
?? ?數據傳送指令用于在寄存器和存儲器之間進行數據的雙向傳輸。
?? ?算術邏輯運算指令完成常用的算術與邏輯的運算,該類指令不但將運算結果保存在目的寄存器中,同時更新CPSR中的相應條件標志位。
?? ?
?? ?1)數據傳送指令(MOV、MVN)
?? ?
?? ?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
?? ?
?? ?
?? ?MVN指令的格式為:
?? ?MVN{條件}{S} 目的寄存器,源操作數
?? ?
?? ?MVN指令可完成從另一個寄存器、被移位的寄存器、或將一個立即數加載到目的寄存器。
?? ?與MOV指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。
?? ?其中S決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值。
?? ?MVN R0,#0xff ;R0 <--- 0xffffff00
?? ?MVN? R1, R2
   MOV? PC, R14?? ?;將寄存器R14的值傳送給PC,用于子程序返回。

?? ?2)數據比較指令(CMP、CMN、TST、TEQ)
?? ?
?? ?CMP{條件} 操作數1,操作數2
?? ?
?? ?CMP指令用于把一個寄存器的內容和另一個寄存器的內容或立即數進行比較,同時更新CPSR中條件標志位的值。
?? ?該指令進行一次減法運算,但不存儲結果,只更改條件標志位。
?? ?標志位表示的是操作數1與操作數2的關系(大、小、相等),例如,當操作數1大于操作操作數2,則此后的有GT 后綴的指令將可以執行。
?? ?
?? ?指令示例:
?? ?CMP R1,?? ?R0? ;將寄存器R1的值與寄存器R0的值相減,并根據結果設置CPSR的標志位
?? ?CMP R1,#100 ;將寄存器R1的值與立即數100相減,并根據結果設置CPSR的標志位
?? ?
?? ?CMN{條件} 操作數1,操作數2
?? ?
?? ?CMN 指令用于把一個寄存器的內容和另一個寄存器的內容或立即數取反后進行比較操作,根據運算結果影響CPSR中的標志位。
?? ?該指令實際完成操作數1和操作數2相加,并根據結果更改條件標志位。
?? ?
?? ?
?? ?TST{條件} 操作數1,操作數2
?? ?
?? ?TST指令用于把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,并根據運算結果更新CPSR中條件標志位的值。
?? ?操作數1是要測試的數據,而操作數2是一個位掩碼,根據測試結果設置相應標志位。
?? ?當位與結果為0時,EQ位被設置。該指令一般用來檢測是否設置了特定的位。
?? ?TST指令通常和EQ、NE條件碼配合使用,當所有測試位為0時,EQ有效,而只要有一個測試位不為0,則NE有效。
?? ?
?? ?指令示例:
?? ?TST R1, #%1 ;用于測試在寄存器R1中是否設置了最低位(%表示二進制數)。
?? ?TST R0, #0X0000 0040 ;指令用來測試R0的位3是否為1。
?? ?
?? ?TEQ{條件} 操作數1,操作數2
?? ?
?? ?TEQ相等測試指令,用于把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的異或運算,并根據運算結果更新CPSR中的條件標志位。
?? ?指令用于比較兩個操作數是否相等。如果相等,則 Z = 1,否則Z = 0。
?? ?指令通常和EQ、NE條件碼配合使用
?? ?
?? ?
?? ?3)算術運算類指令(ADD、ADC、SUB、SBC、RSB、RSC)
?? ?
?? ?算術運算類指令 {條件} {S} 目的寄存器,操作數1,操作數2
?? ?目的寄存器,操作數1和操作數2使用的寄存器必須在R0~R7之間。
?? ?操作數1應該是一個寄存器,操作數2可以是一個寄存器、被移位的寄存器或一個立即數。
?? ?
?? ?ADD指令完成的功能是將操作數1加上操作數2,結果送到目的寄存器。
?? ?ADC指令完成的功能是將操作數1加上操作數2,再加上標志位C的值,結果送到目的寄存器。
?? ?SUB指令完成的功能是將操作數1減去操作數2,結果送到目的寄存器。
?? ?SBC指令完成的功能是將操作數1減去操作數2,再減去標志位C的取反值,結果送到目的寄存器。
?? ?RSB逆向減法指令完成的功能是將操作數2減去操作數1,結果送到目的寄存器。
?? ?RSC帶借位的逆向減法指令完成的功能是將操作數2減去操作數1,再減去標志位C的取反值,結果送到目的寄存器。
?? ?
?? ?
?? ?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)
?? ?
?? ?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)
?? ?
?? ?ADDS? R1, R1, #10? ??? ??? ?;結果影響標志位
??? ADD?? R1, R1, R2? ??? ??? ? ;結果不影響標志位
??? ADD?? R3, R1, R2, LSL #2? ? ; R3 = R1 + ( R2 << 2 )

?? ?SUB? R0, R1, #256 ??? ??? ? ;R0 = R1 - 256 , 結果不影響標志位
?? ?SUBS? R0, R2, R3, LSL #1 ?? ;R0 = R2 - ( R3 <<1 ),結果影響標志位
?? ?SUB? SP, #380? ??? ??? ??? ?;SP = SP - 380
?? ?SBC? R0, R1, R2 ?? ??? ??? ?;R0 = R1 - R2 - !C
?? ?RSC? R0, R1, R2 ?? ??? ??? ?;R0 = R2 - R1 - !C
?? ?
?? ?4)邏輯運算類指令(AND、ORR、EOR、BIC)
?? ?
?? ?AND{條件}{S} 目的寄存器,操作數1,操作數2
?? ?
?? ?AND指令用于在兩個操作數上進行邏輯與運算,并把結果放置到目的寄存器中。
?? ?操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。
?? ?該指令常用于屏蔽操作數1的某些位。
?? ?S選項,說明運算結果影響CPSR的條件標志位,沒有S選項,則不影響CPSR的條件標志位。
?? ?AND R0, R0, #3 ?? ?;該指令保持R0的0、1位,其余位清零。
?? ?
?? ?
?? ?ORR{條件}{S} 目的寄存器,操作數1,操作數2
?? ?
?? ?ORR指令用于在兩個操作數上進行邏輯或運算,并把結果放置到目的寄存器中。
?? ?操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。
?? ?該指令常用于設置操作數1的某些位。
?? ?ORR R0, R0, #3? ;該指令設置R0的0、1位,其余位保持不變。
?? ?
?? ?
?? ?EOR{條件}{S} 目的寄存器,操作數1,操作數2
?? ?
?? ?EOR(異或)指令常用于將操作數1的某個位取反。與0相異或,保持不變,與1相異或,則取反。
?? ?
?? ?
?? ?BIC{cond}{S} Rd, Rn, operand2
?? ?
?? ?BIC指令用于清除Rn 中的某些位,并把結果存放在Rd中,操作數operand2 為32位的掩碼,如果掩碼中設置了某一位為1,則清除這一位。未設置的掩碼位保持不變。
?? ?BIC R0, R0, #%1011 ;將R0的0,1,3位清零,其余位不變。
?? ?
?? ?5)乘法指令與乘加指令
?? ?
?? ?ARM微處理器支持的乘法指令與乘加指令共有6條,可分為運算結果為32位和結果為64位兩類,與前面的數據處理指令不同,
?? ?指令中的所有操作數、目的寄存器必須為通用寄存器,不能對操作數使用立即數或被移位的寄存器,
?? ?同時,目的寄存器和操作數1必須是不同的寄存器。
?? ?
?? ?MUL{條件}{S} 目的寄存器,操作數1,操作數2
?? ?
?? ?目的寄存器 = 操作數1 × 操作數2,同時可以根據運算結果設置CPSR中相應的條件標志位N和Z。
?? ?MUL指令完成將操作數1與操作數2的乘法運算,并把結果放置到目的寄存器中,同時可以根據運算結果設置CPSR中相應的條件標志位。
?? ?其中,操作數1和操作數2均為32位的有符號數或無符號數。
?? ?
?? ?MUL R0, R1, R2 ?? ?;R0 = R1 × R2
?? ?MULS R0, R1, R2 ;R0 = R1 × R2,同時設置CPSR中的相關條件標志位
?? ?

?? ?MLA {條件} {S} 目的寄存器,操作數1, 操作數2, 操作數3
?? ?
?? ?目的寄存器 = 操作數1 × 操作數2 + 操作數3,同時可以根據運算結果設置CPSR中相應的條件標志位N和Z。
?? ?操作數1和操作數2均為32位的有符號數或無符號數。
?? ?
?? ?
?? ?SMULL指令(S:Signed, 有符號)
?? ?SMULL {條件} {S} 目的寄存器Low,目的寄存器High,操作數1, 操作數2
?? ?
?? ?目的寄存器Low = (操作數1 × 操作數2 )的低32位,
?? ?目的寄存器High = (操作數1 × 操作數2 )的高32位,同時可以根據運算結果設置CPSR中相應的條件標志位。
?? ?操作數1和操作數2均為32位的有符號數。
?? ?
?? ?SMULL? R0, R1, R2, R3?? ?;R0 = (R2 ×R3)的低32位, R1 = (R2 ×R3)的高32位。
?? ?
?? ?
?? ?
?? ?SMLAL指令(S:Signed, 有符號)
?? ?SMLAL {條件} {S} 目的寄存器Low,目的寄存器High,操作數1, 操作數2
?? ?
?? ?目的寄存器Low = (操作數1 × 操作數2 )的低32位 + 目的寄存器Low,
?? ?目的寄存器High = (操作數1 × 操作數2 )的高32位 + 目的寄存器High,同時可以根據運算結果設置CPSR中相應的條件標志位。
?? ?操作數1和操作數2均為32位的有符號數。
?? ?
?? ?SMLAL? R0, R1, R2, R3?? ?;R0 = (R2 ×R3)的低32位 + R0,
?? ??? ??? ??? ??? ??? ??? ?;R1 = (R2 ×R3)的高32位 + R1。
?? ?
?? ?
?? ?UMULL指令(U:UnSigned, 無符號)
?? ?UMULL {條件} {S} 目的寄存器Low,目的寄存器High,操作數1, 操作數2
?? ?
?? ?目的寄存器Low = (操作數1 × 操作數2 )的低32位,
?? ?目的寄存器High = (操作數1 × 操作數2 )的高32位,同時可以根據運算結果設置CPSR中相應的條件標志位。
?? ?操作數1和操作數2均為32位的無符號數。
?? ?
?? ?UMULL? R0, R1, R2, R3?? ?;R0 = (R2 ×R3)的低32位, R1 = (R2 ×R3)的高32位。
?? ?
?? ?
?? ?
?? ?UMLAL指令(U:UnSigned, 無符號)
?? ?UMLAL {條件} {S} 目的寄存器Low,目的寄存器High,操作數1, 操作數2
?? ?
?? ?目的寄存器Low = (操作數1 × 操作數2 )的低32位 + 目的寄存器Low,
?? ?目的寄存器High = (操作數1 × 操作數2 )的高32位 + 目的寄存器High,同時可以根據運算結果設置CPSR中相應的條件標志位。
?? ?操作數1和操作數2均為32位的無符號數。
?? ?
?? ?UMLAL? R0, R1, R2, R3
?? ?;R0 = (R2 ×R3)的低32位 + R0,
?? ?;R1 = (R2 ×R3)的高32位 + R1。
?? ?
?? ?
三、程序狀態寄存器訪問指令

?? ?ARM微處理器支持程序狀態寄存器訪問指令,用于在程序狀態寄存器和通用寄存器之間傳送數據。
?? ?
?? ?MRS {條件}? 通用寄存器, 程序狀態寄存器(CPSR、SPSR)
?? ?
?? ?將狀態寄存器的內容傳送到通用寄存器。
?? ?使用環境:
?? ?1)當需要改變程序狀態寄存器的內容時,可用MRS將狀態寄存器的內容讀入到通用寄存器,修改后再寫回到程序狀態寄存器。
?? ?2)當在異常處理或進程切換時,需要保存程序狀態寄存器的值,可先用該指令讀出程序狀態寄存器的值,然后保存。
?? ?
?? ?
?? ?MSR {條件}? 程序狀態寄存器(CPSR、SPSR)_<域>,操作數
?? ?
?? ?將操作數的內容傳送到程序狀態寄存器的特定域中。其中,操作數可以為通用寄存器或立即數。
?? ?<域>用于設置程序狀態寄存器中需要操作的位,32位的程序狀態寄存器分為4個域:
?? ?
?? ?f域:位31~位24為條件標志位域;
?? ?s域:位23~位16為狀態位域;
?? ?x域:位15~位8為擴展位域;
?? ?c域:位7~位0為控制位域;
?? ?
?? ?該指令通常用于恢復或改變程序狀態寄存器的內容,在使用時,一般要在MSR指令中指明將要操作的域。
?? ?
?? ?使用環境:
?? ?1)當需要改變程序狀態寄存器的內容時,可用MRS將狀態寄存器的內容讀入到通用寄存器,修改后再寫回到程序狀態寄存器。
?? ?2)當在異常處理或進程切換時,需要保存程序狀態寄存器的值,可先用該指令讀出程序狀態寄存器的值,然后保存。
?? ?
?? ?MSR? CPSR, R0 ?? ??? ??? ?;CPSR←R0
?? ?MSR? SPSR_c, R0 ??? ??? ?;傳送R0到SPSR,但僅修改SPSR中的控制位域
?? ?MSR? CPSR_c, #0XD3 ?? ?; CPSR[7..0] = 0XD3 , 即切換到管理模式
?? ?MSR? CPSR_cxsf, R3 ??? ?; CPSR ← R3
?? ?
?? ?注意:只有在特權模式下,才能修改狀態寄存器。
?? ?程序中不能通過MSR指令直接修改CPSR中的T控制位來實現ARM/Thumb狀態的切換,必須使用BX指令來完成處理器狀態的切換。
?? ?MRS與MSR配合使用,可以實現CPSR或SPSR寄存器的讀/修改/寫操作,進行處理器模式 切換,進行允許/禁止IRQ/FIQ中斷等的設置。
?? ?
?? ?例:使能IRQ中斷
?? ?MRS? R0, CPSR
?? ?BIC? R0, R0, #0X80
?? ?MSR? CPSR_c, R0
?? ?MOV? PC, LR
?? ?
?? ?例:禁止IRQ中斷
?? ?MRS? R0, CPSR
?? ?ORR? R0, R0, #0X80
?? ?MSR? CPSR_c, R0
?? ?MOV? PC,? LR
?? ?
四、存儲器加載/存儲指令

?? ?用于在寄存器和存儲器之間傳送數據,加載指令用于將存儲器中的數據傳送到寄存器,存儲指令則將寄存器中的數據傳送到存儲器。
?? ?存儲器加載/存儲指令分為單個存儲器加載/存儲指令和多個存儲器加載/存儲指令。

?? ?1)單個存儲器加載/存儲指令
?? ?
?? ?LDR字數據加載指令;
?? ?LDRH(Half)半字數據加載指令;
?? ?LDRB字節數據加載指令;
?? ?STR字數據存儲指令;
?? ?STRH半字數據存儲指令;
?? ?STRB字節數據存儲指令。


?? ?? 加載指令

?? ?加載指令 {條件} 目的寄存器, <存儲器地址>
?? ?
?? ?LDR? R0, [R1]? ??? ??? ??? ?;將地址為R1的字數據讀入R0。
?? ?LDR? R0, [R1, R2] ??? ??? ??? ?;將地址為R1+R2的字數據讀入R0。
?? ?LDR? R0, [R1, #4]?? ??? ??? ?;將地址為R1+4的字數據讀入R0。
?? ?LDR? R0, [R1, R2]!?? ??? ??? ?;將地址為R1+R2的字數據讀入R0,并將新地址R1+R2寫入R1。
?? ?LDR? R0, [R1, R2, LSL #2 ]!?? ?;將地址為R1 + R2 × 4的字數據讀入R0,并將新地址R1 + R2 × 4寫入R1。


?? ?LDRH指令用于從存儲器中將一個16位的半字數據傳送到目的寄存器中,同時將寄存器的高16位清零。
?? ?LDRH? R0, [R1]?? ;將地址為R1的半字數據讀入R0,并將R0的高16位清零。
?? ?LDRB指令用于從存儲器中將一個8位的字節數據傳送到目的寄存器中,同時將寄存器的高24位清零。
?? ?LDRB? R0, [R1]?? ;將地址為R1的字節數據讀入R0,并將R0的高24位清零。
?? ?注意:當是字操作時,操作數的地址必須是字對齊的,如果是半字操作,操作數的地址必須是半字對齊。否則,讀出的數據是無效,隨機的。
?? ?
?? ?LDR? R0, [R1, # 2]
?? ?LDRH? R0, [R1, # 1]
?? ?
?? ?
?? ?存儲指令
?? ?
?? ?存儲指令 {條件} 源寄存器, <存儲器地址>
?? ?
?? ?STR? R0, [R1], #8? ;將R0中的字數據寫入以R1為地址的存儲器中,并將新地址R1+8寫入R1。
?? ?STR? R0, [R1 , #8] ;將R0中的字數據寫入以R1+8為地址的存儲器中。
?? ?
?? ?
?? ?STRH指令用于從源寄存器中將一個16位的半字數據傳送到存儲器中。該半字數據為源寄存器中的低16位。
?? ?STRH? R0, [R1, #8]? ;將寄存器R0中的低16位寫入以R1 + 8為地址的存儲器中。
?? ?
?? ?
?? ?STRB指令用于從源寄存器中將一個8位的字節數據傳送到存儲器中。該字節數據為源寄存器中的低8位。
?? ?注意:當是字操作時,操作的地址必須是字對齊的,如果是半字操作,操作的地址必須是半字對齊。否則,讀出的數據是無效,隨機的。
?? ?
?? ?
?? ?2)批量數據加載/存儲指令
?? ?可以一次在一片連續的存儲器單元和多個寄存器之間傳送數據,批量加載指令用于將一片連續的存儲器中的數據傳送到多個寄存器,批量數據存儲指令完成相反的操作。

?? ?LDM(或STM)指令(Load Data To Multiple Register)
?? ?LDM(或STM) {條件} {類型} 基址寄存器{!}? ,寄存器列表{^}
?? ?
?? ?{類型}為以下幾種情況:
?? ?
?? ??? ??? ?類 型?? ??? ??? ??? ?含???? 義
?? ??? ??? ?IA?? ??? ??? ??? ?每次操作后,地址加4
?? ??? ??? ?IB?? ??? ??? ??? ?每次操作前,地址加4
?? ??? ??? ?DA?? ??? ??? ??? ?每次操作后,地址減4
?? ??? ??? ?DB?? ??? ??? ??? ?每次操作前,地址減4
?? ??? ??? ?FD?? ??? ??? ??? ?滿遞減堆棧
?? ??? ??? ?ED?? ??? ??? ??? ?空遞減堆棧
?? ??? ??? ?FA?? ??? ??? ??? ?滿遞增堆棧
?? ??? ??? ?EA?? ??? ??? ??? ?空遞增堆棧
?? ?
?? ?{!}為可選后綴,若選用,則當數據傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存器的內容不改變。
?? ?基址寄存器不允許為R15,寄存器列表可以為R0 ~ R15的任意組合。
?? ?{^}為可選后綴,當指令為LDM且寄存器列表中包含有R15,選用該后綴表示:除了正常的數據傳送之外,還將SPSR復制到CPSR。同時,該后綴還表示傳入或付傳出的是用戶模式下的寄存器,而不是當前模式下的寄存器。
?? ?
?? ?例:
?? ?STMFD? SP!, {R0 - R7 , LR}?? ;現場保存,將R0 - R7 , LR入棧,滿遞減堆棧。
?? ?LDMFD? SP!, {R0 - R7 , PC}^? ;恢復現場,異常處理返回,滿遞減堆棧
?? ?在進行數據復制時,先設置好源數據指針,然后使用塊拷貝尋址指令進行讀取和存儲。而在堆棧操作中,則要先設置堆棧指針SP,然后使用堆棧尋址指令實現堆棧操作。


五、數據交換指令
?? ?
?? ?支持在存儲器和寄存器之間交換數據。
?? ?
?? ?SWP ((Swap)字數據交換指令;
?? ?SWPB? 字節數據交換指令。
?? ?
?? ?交換指令? {條件} 目的寄存器, 源寄存器1, [源寄存器2]
?? ?
?? ?SWP? R0, R1, [R2] ?? ?;將R2所指的存儲器中的字數據傳送到R0,同時將R1中的字數據傳送到R2所指的存儲器單元。
?? ?顯然,當源寄存器1與目的寄存器是同一個寄存器時,就完成了寄存器與存儲器間的交換操作。
?? ?SWPB指令用于將源寄存器2所指向的存儲器中的字節數據到目的寄存器中,目的寄存器的高24位清零,同時將源寄存器1中的低8位數據(低位字節)傳送到源寄存器2所指向的存儲器中。
?? ?
?? ?
六、異常產生指令
?? ?
?? ?異常指令有兩條:SWI軟件中斷指令和BKPT斷點中斷指令。
?? ?
?? ?SWI? {條件}? 24位的立即數
?? ?
?? ?產生軟件中斷,方便用戶程序調用操作系統的系統例程。
?? ?切換運行模式到管理模式,設置PC來執行在地址0X08處的下一條指令,設置相應的R13_svc和R14_svc。該指令的操作與執行BL 0X08這條指令的效果是相同的。不同的地方在于,SWI還帶有指明系統例程的類型的“24位的立即數”。在具體應用中,為便于記憶,可以使用字符串代替“24位的立即數”,例如:SWI? “OS_Write0”和 SWI? 0X02是一樣的。當指令中24位的立即數被忽略時,系統例程的類型由通用寄存器R0的內容決定。傳送給系統例程的參數通過通用寄存器來傳遞。
?? ?
?? ?
?? ?BKPT? 16位的立即數
?? ?
?? ?用于產生軟件斷點中斷,執行時中斷正常指令,進入相應的調試子程序。
?? ?
?? ?
七、協處理器指令
?? ?
?? ?ARM處理器可支持多達16個協處理器,每個協處理器只執行針對其自身的協處理指令。
?? ?ARM的協處理器指令主要用于ARM處理器初始化、協處理器的數據處理操作、在ARM處理器與協處理器的寄存器之間傳送數據、在協處理器和存儲器之間傳送數據。
?? ?ARM協處理器指令有以下5條:
?? ?
?? ?1)CDP協處理器數據操作指令;
?? ?2)LDC協處理器數據加載指令;
?? ?3)STC協處理器數據存儲指令;
?? ?4)MCR? ARM處理器寄存器到協處理器寄存器的數據傳送指令;
?? ?5)MRC? 協處理器寄存器到ARM處理器寄存器的數據傳送指令。
?? ?
?? ?1)CDP指令
?? ?
?? ?CDP {條件}協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2
?? ?用于ARM處理器通知協處理器執行特定的操作,若協處理器不能執行指定的操作,則產生未定義指令異常。
?? ?注意:指令中涉及到的寄存器都是協處理器的寄存器,不涉及ARM處理器的寄存器和存儲器。操作碼1、操作碼2是協處理器要執行的操作。
?? ?
?? ?CDP? p5, 1, c3, c4, c5, 2
?? ?;指示協處理器P5,執行操作1,可選操作為2;C3, C4, C5是相應的協處理器寄存器。
?? ?
?? ?2)LDC指令
?? ?
?? ?LDC {條件}{L}協處理器編碼,目的寄存器,[源寄存器]
?? ?
?? ?用于將源寄存器所指向的存儲器中的字數據傳送到目的寄存器中。若協處理器不能成功執行,則產生未定義指令異常。選項{L}表示指令為長讀取操作,可用于雙精度數據的傳輸。
?? ?注意:指令中涉及到的源寄存器是ARM處理器的寄存器。
?? ?
?? ?LDC? P3, C4, [R2, #4]
?? ?
?? ?3) STC指令
?? ?
?? ?STC {條件}{L}協處理器編碼,源寄存器,[目的寄存器]
?? ?
?? ?用于將源寄存器中的字數據傳送到目的寄存器所指向的存儲器中。若協處理器不能成功執行,則產生未定義指令異常。選項{L}表示指令為長讀取操作,可用于雙精度數據的傳輸。
?? ?
?? ?注意:指令中涉及到的目的寄存器是ARM處理器的寄存器。
?? ?
?? ?STC? P3, C4, [R0]
?? ?
?? ?;將協處理器P3的寄存器C4中的數據傳送到ARM處理器的寄存器R0所指向的存儲器.
?? ?
?? ?4)MCR指令
?? ?
?? ?MCR {條件} 協處理器編碼,協處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協處理器操作碼2
?? ?MCR指令用于將ARM處理器寄存器中的數據傳送到協處理器的寄存器中。若協處理器不能完成這個操作,將引發未定義指令異常。源寄存器為ARM處理器的寄存器。
?? ?
?? ?5)MRC指令
?? ?
?? ?MRC {條件}協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2
?? ?MRC指令用于將協處理器寄存器中的數送到ARM處理器的寄存器中。若協處理器不能完成這個操作,將引發未定義指令異常。源寄存器為ARM處理器的寄存器。
?? ?
?? ?MRC? P3 , 3 , R0 , C4 , C5 , 6
?? ?;將協處理器P3的寄存器C4與C5中的數據傳送到ARM的寄存器中,并執行編號為3和6的操作。
?? ?
?? ?
?? ?
?? ?Thumb指令集合
?? ?
?? ?Thumb指令集是ARM指令集的一個子集,允許指令編碼為16位的長度,Thumb指令集在保留32位代碼優勢的同時,大大節省了系統的存儲空間。
?? ?當處理器在執行ARM程序段時,稱ARM處理器處于ARM工作狀態,當處理器在執行Thumb程序段時,稱ARM處理器處于Thumb工作狀態。
?? ?在編寫Thumb指令時,先要用偽指令CODE16聲明以下為Thumb指令代碼,在ARM指令代碼中可以使用BX指令跳轉到Thumb指令代碼片。同樣編寫ARM代碼時,則使用偽指令CODE32進行聲明,在Thumb指令代碼中使用BX指令可以跳轉到ARM指令代碼處。
?? ?大多數Thumb指令是無條件執行的,而幾乎所有的ARM指令都是有條件執行的。由于Thumb數據處理指令中的目的寄存器與其中的一個源寄存器相同,Thumb指令在指令編碼時由三個操作數改為兩個操作數。
?? ?通常實現同樣的程序功能時,所需的Thumb指令的條數比ARM指令多。但使用Thumb指令集合的代碼有以下特點:
?? ?
?? ?1)比ARM代碼更節略存儲空間。
?? ?2)使用的指令條數比ARM代碼多。
?? ?3)若使用32位的存儲器,ARM代碼比Thumb代碼快約40%。
?? ?4)若使用16位的存儲器,Thumb代碼比ARM代碼快約40%~50%。
?? ?5)與ARM代碼相比較,使用Thumb代碼,存儲器的功耗會降低約30%。

總結

以上是生活随笔為你收集整理的ARM指令集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。