ARM 匯編指令學習:[2]ARM指令集

ARM 匯編指令學習:[2]ARM指令集


一、跳轉指令

1、 B(跳轉指令)及BL(帶返回跳轉指令)

    B{L}{<cond>} <target_address>

其中:

L 決定是否保存當前PC寄存器地址到LR寄存器中。

<target_address> 為指令跳轉的目標地址。這個地址的計算方法是:將指令中的24位帶符號的補碼立即數擴展為32位(擴展其符號位);將此32位數左移兩位;將得到的值加到PC寄存器中,即得到跳轉的目標地址。由這種計算方法可知跳轉的范圍大致為-32MB~+32MB。


2、 第一種BLX(帶返回和狀態切換的跳轉指令)

    BLX <target_address>

其中,<target_address>的用法與B及BL指令中的用法相同。


3、 第二種BLX(帶返回和狀態切換的跳轉指令)

    BLX{<cond>} <Rm>

其中:

<Rm> 該寄存器中為跳轉的目標地址。當<Rm>寄存器的bit[0]值為0時,目標地址處的指令為ARM指令;當<Rm>寄存器的bit[0]值為1時,目標地址處的指令為Thumb指令。當<Rm>寄存器為R15(PC)時,會產生不可預知的結果(跑飛)。


4、 BX(帶狀態切換的跳轉指令)

    BX{<cond>} <Rm>

其中,<Rm>的用法與BLX指令中的用法相同。


二、數據處理指令

1、 MOV 數據傳送指令

    MOV{<cond>}{S} <Rd>, <shifter_operand>

MOV指令將<shifter_operand>表示的數據傳送到目標寄存器<Rd>中,并根據操作的結果更新CPSR中相應的條件標志位。


2、 MVN 數據求反傳送指令

    MVN{<cond>}{S} <Rd>, <shifter_operand>

MVN指令將<shifter_operand>表示的數據的反碼傳送到目標寄存器<Rd>中,并根據操作的結果更新CPSR中相應的條件標志位。


3、 CMP 比較指令

    CMP{<cond>} <Rn>, <shifter_operand>

CMP指令從寄存器<Rn>中減去<shifter_operand>表示的數據,并根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。


4、 CMN 基于相反數的比較指令

    CMN{<cond>} <Rn>, <shifter_operand>

CMN指令從寄存器<Rn>中加上<shifter_operand>表示的數據,并根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。


5、 TST 位測試指令

    TST{<cond>} <Rn>, <shifter_operand>

TST指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯與操作,并根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。


6、 TEQ 相等測試指令

    TEQ{<cond>} <Rn>, <shifter_operand>

TEQ指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯異或操作,并根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。


7、 ADD 加法指令

    ADD{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

ADD指令將<shifter_operand>表示的數據的與<Rn>的值相加,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


8、 SUB 減法指令

    SUB{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

SUB指令從寄存器<Rn>中減去<shifter_operand>表示的數據,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


9、 RSB 逆向減法指令

    RSB{<cond> }{S} <Rd>, <Rn>, <shifter_operand>

RSB指令從<shifter_operand>表示的數據中減去寄存器<Rn>的值,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


10、 ADC 帶位加法指令

    ADC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

ADC指令將<shifter_operand>表示的數據的與<Rn>的值相加,再加上寄存器CPSR中的C條件標志位的值,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


11、 SBC 帶位減法指令

    SBC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

SBC指令從寄存器<Rn>中減去<shifter_operand>表示的數據,再減去寄存器CPSR中的C條件標志位的反碼,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


12、 RSC 帶位逆向減法指令

    RSC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

RSC指令從<shifter_operand>表示的數據中減去寄存器<Rn>的值,再減去寄存器CPSR中的C條件標志位的反碼,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


13、 AND 邏輯與操作指令

    AND{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

AND指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯與操作,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


14、 BIC 位清除指令

    BIC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

BIC指令將<shifter_operand>表示的數據與寄存器<Rn>的反碼按位作邏輯與操作,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


15、 EOR 邏輯異或操作指令

    EOR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

EOR指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯異或操作,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


16、 ORR 邏輯或操作指令

    ORR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>

ORR指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯或操作,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。


17、 乘法指令

  • MUL 32位乘法指令
    MUL{<cond>}{S} <Rd>, <Rm>, <Rs>

示例

    MUL R0, R1, R2 ;  R0=R1*R2

  • MLA 32位帶加數的乘法指令
    MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn>

示例

    MLA R0, R1, R2, R3 ;  R0=R1*R2+R3

  • SMULL 64位有符號數乘法指令
    SMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>

示例

    SMULL R1, R2, R3, R4 ;  R1=R3*R4的低32位;R2=R3*R4的高32位

  • SMLAL 64位帶加數的有符號數乘法指令
    SMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>

示例

    SMLAL R1, R2, R3, R4 ;  R1=R3*R4的低32位+R1;R2=R3*R4的高32位+R2

  • UMULL 64位無符號數乘法指令
    UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>

  • UMLAL 64位帶加數的無符號數乘法指令
    UMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>

18、 雜類的算術指令

  • CLZ 前導0個數計數指令
    CLZ{<cond>} <Rd>, <Rm>

CLZ指令用于計算寄存器中操作數最高端的0的個數。如果操作數的bit[31]為1,則指令返回0;如果操作數為0,則指令返回32。


三、程序狀態寄存器(PSR)傳輸指令

1、 MRS 狀態寄存器到通用寄存器的傳送指令

    MRS{<cond>} <Rd>, CPSR
    MRS{<cond>} <Rd>, SPSR

2、 MSR 通用寄存器到狀態寄存器的傳送指令

    MSR{<cond>} CPSR_<fields>, #<immediate>
    MSR{<cond>} CPSR_<fields>, <Rm>
    MSR{<cond>} SPSR_<fields>, #<immediate>
    MSR{<cond>} SPSR_<fields>, <Rm>

四、Load/Store指令

  • LDR
  • LDRB
  • LDRBT
  • LDRH
  • LDRSB
  • LDRSH
  • LDRT
  • STR
  • STRB
  • STRBT
  • STRH
  • STRSB
  • STRSH
  • STRT
  • ......

詳見我的上一篇文章。


信號量操作指令

  • SWP 交換指令
    SWP{<cond>} <Rd>, <Rm>, [<Rn>]

示例

    SWP R1, R2, [R3] ;  將內存單元(R3)中的字數據讀取到R1寄存器中,同時將R2寄存器的數據寫入到內存單元(R3)中

  • SWPB 字節交換指令
    SWPB{<cond>} <Rd>, <Rm>, [<Rn>]

示例

    SWPB R1, R2, [R3] ;  將內存單元(R3)中的字節數據讀取到R1寄存器中,R1的高24位為0,同時將R2寄存器的低8位寫入到內存單元(R3)中

五、協處理器指令

1、 CDP 協處理器數據操作指令

    CDP{<cond>} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>, <opcode_2>
    CDP2 <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>, <opcode_2>

本指令是ARM處理器用于通知ARM協處理器執行特定的操作。該操作不涉及ARM寄存器和內存單元。

示例

    CPD p5, 2, c12, c10, c3, 4 ;  協處理器p5的操作初始化。其中,操作碼1為2,操作碼2為4,目標寄存器為c12,源操作寄存器為c10和c3

2、 LDC 協處理器數據讀取指令

    LDC{<cond>}{L} <coproc>, <CRd>, <addressing_mode>
    LDC2{L} <coproc>, <CRd>, <addressing_mode>

LDC指令從一系列連續的內存單元將數據讀取到協處理器的寄存器中。

示例

    LDC p6, CR4, [R2, #4] ;  R2為ARM處理器,指令讀取內存單元(R2+4)的字數據,傳送到協處理器p6的CR4寄存器中

3、 STC 協處理器數據寫入指令

    STC{<cond>}{L} <coproc>, <CRd>, <addressing_mode>
    STC2{L} <coproc>, <CRd>, <addressing_mode>

STC指令將協處理器的寄存器中的數據寫入到一系列連續的內存單元中。

示例

    STC p6, CR4, [R2, #4] ;  R2為ARM處理器,指令將協處理器p6的CR4寄存器中的字數據寫入到內存單元(R2+4)中

4、 MCR ARM寄存器到協處理器寄存器的數據傳送指令

    MCR{<cond>} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
    MCR2 <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}

MCR指令將ARM處理器的寄存器中的數據傳送到協處理器的寄存器中。

示例

    MCR p14, 3, R7, c7, c11, 6 ;  指令將ARM寄存器中將數據傳送到協處理器p14的寄存器中,其中R7為ARM處理器,存放源操作數;C7和C11為協處理器寄存器,為目標寄存器;操作碼1為3,操作碼2為6

5、 MRC 協處理器寄存器到ARM寄存器的數據傳送指令

    MRC{<cond>} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
    MRC2 <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}

MRC指令將協處理器的寄存器中的數據傳送到ARM處理器的寄存器中。

示例

    MRC p14, 3, R7, c7, c11, 6 ;  指令將協處理器p14的寄存器中將數據傳送到ARM寄存器中,其中R7為ARM處理器,為目標寄存器;C7和C11為協處理器寄存器,存放源操作數;操作碼1為3,操作碼2為6

六、異常中斷產生指令

1、 SWI 軟中斷指令

    SWI{<cond>} <immed_24>

SWI指令用于產生軟中斷。


2、 BKPT 斷點中斷指令

    BKPT <immed_16>

BKPT指令用于產生軟件斷點中斷。軟件調試程序可以使用該中斷。當系統使用硬件調試部件時可以忽略該中斷。


參考自《ARM體系架構與編程》杜春雷


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容