<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        arm匯編指令

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月27日   【字體:
         
        ARM匯編:
         
        指令
        偽指令
        符號
         
        arm指令分類:
        跳轉指令
        數據處理指令
        數據傳送指令
        乘法指令
        Load/Store(加載存儲)指令
        程序狀態寄存器訪問指令
        通用寄存器和存儲器內容交換指令
        異常產生指令
        協處理指令(暫時不講)
        信號量指令(暫時不講)
        其他擴展指令(暫時不講)
         
        指令尋址方式:
        數據處理指令操作數尋址方式
        內存訪問指令尋址方式
         
        幾乎所有arm指令都能條件執行:
        31 30 29 28  四位表示條件位,共16個條件。
        Cpsr中的條件標志位NZCV的值來確定指令是否執行。
         
        cond的16種條件:
         
        shifter_operand(第二源操作數)的三種形式:
         
        #     立即數
        指令里面的立即數前面加#。
        嵌入式一般用十六進制,前面加0x。
         
                  寄存器
         
        寄存器移位9種:
         
        邏輯左移:將Rm寄存器邏輯左移shift_imm(立即數)位或Rs(寄存器)位。
        ,LSL  #/
         
        邏輯右移:
        ,LSR  #/
         
        算術右移:
        ,ASR  #/
         
        循環右移
        ,ROR  #/
         
        擴展循環右移:
        ,RRX  :Rm擴展的循環右移一位。
         
        S標志位:
        決定是否更新cpsr中的標志位;
        如果S=1,更新cpsr標志位,當Rd不為R15,cpsr中的NZCV根據指令的執行結果設置,其他位不動;當Rd是R15,當前程序狀態的spsr拷貝到cpsr。
        如果S=0,不更新cpsr。
         
        {}表示可選項.
        -----------------------------------------
        跳轉指令:
        B     :跳轉,用于死循環
        BL     :帶返回的跳轉,函數調用
        BX     :跳轉并切換狀態
        BLX:帶返回的跳轉并切換狀態
         
        三種跳轉形式:
        1.跳轉到標號處LABLE
        2.跳轉到絕對地址0xXXX
        3.跳轉到子程序func處
        -----------
        跳轉(B)和帶返回的跳轉(BL)
        B{L}{}   
         
        編碼格式:
        條件代碼標識     控制位
        31-28                    24          23-0
        NZCV      101        L       跳轉的地址  
         
        L:L位,也就是寄存器的24位,bit【24】=1,指令存儲返回地址到LR,bit【24】=0,不保存返回地址。
         
        cond:指令執行的條件
         
        target_address:指令跳轉的目標地址;計算目標地址方法:
        將24位帶符號的補碼立即數擴展為32位;
        將擴展后的32位立即數左移兩位;
        將得到的值加到PC寄存器中即可。
         
        ----------
        跳轉并切換狀態
        BX{}    
        Rm的第0位拷貝到cpsr的T位,其他位移入PC。
         
        編碼格式:
        條件代碼標識           
        31-28                          19-16     15-12                           3-0
        NZCV   00010010      SB0        SB0          0001         Rm  
         
        cond:指令執行條件
         
        :包含跳轉指令的目標地址;Rm的bit【0】=0,目標地址處指令為ARM指令;如果bit【1】=1,目標地址處指令為Thumb指令。
         
        ----------
        帶狀態切換的連接跳轉指令
        BLX     
         
        編碼格式:
        條件代碼標識           
        31-28               24    23-0
        1111       101     H     Rm 
         
        target_add:指令的跳轉目標地址;計算方法:
        將24位擴展為32位立即數;
        將結果左移兩位;
        將H(bit【24】)加到結果地址的第一位bit【1】;
        將結果累加進程序計數器pc中。
         
        BLX{comd}    
        Rm的第0位拷貝到cpsr的T位,其他位移入PC。
         
        編碼格式:
        條件代碼標識           
        31-28                     19-16     11-8                   3-0
        NZCV   00010010      SB0      SB0       0011       Rm 
         
        cond:指令執行條件
         
        Rm:寄存器Rm指定轉移目標,Rm的bit【0】=1,跳轉時自動將cpsr的標志位T置位,就是解釋為Thumb,否則解釋為ARM。
         
        -------------------------------------------
        數據處理指令:
         
        算數運算指令
        ADD:加
        ADC:帶進位的加
        SUB:減
        RSB:翻轉減
        SBC:帶進位的減
        RSC:帶進位的翻轉減
         
        測試與測試指令
        TST:測試
        TEQ:測試相等
        CMP:比較
        CMN:負數比較
         
        邏輯指令
        BIC:位清0
        AND:邏輯加
        ORR:邏輯或
        EOR:邏輯異或
         
        編碼格式:
        條件代碼標識           
        31-28            25       24-21        20    19-16     15-12       11-0
        NZCV   00    I          opcode      S      Rn         Rd          shiter_operand
         
        I:區分第二操作偶數是立即數還是寄存器
         
        S:標志指令的條件域是否更新cpsr
         
        Opcode:操作符
        Rd:指示目的寄存器
         
        Rn:指示第一源操作寄存器
         
        Shifter_operand:指示第二源操作數,可以是立即數,寄存器,寄存器移位三種形式:
         
        數據處理指令的語法格式分兩種:
        算術運算和邏輯運算的格式:
        {}{S}  ,,
        比較和測試的格式(沒有Rd; S=1)
        {}     ,
         
        -----
        算數運算指令
         
        ADD{}{S}        ,,
        將shifter_operand加Rn,結果存到Rd中。
         
        ADC{}{S} ,,         帶進位的加法,處理大于32位的加法
        將shifter_operand加Rn,再加cpsr中的C標志位,結果存到Rd。
         
        SUB{}{S} ,,
        將Rn減shifter_operand,結果保存到Rd中。
         
        SBC{}{S} ,,     帶進位的減法,處理大于32位的減法
        Rn減去shifter_operand,再減去cpsr中的C標志位的反碼,結果保存到Rd。
         
        RSB{}{S} ,,          翻轉減,處理負數
        shifter_operand減去Rn,結果保存到Rd。
         
        RSC{}{S} ,,     帶進位的翻轉減,處理大于32位的負數
        shifter_operand減去Rn,再減去cpsr中的C標志位的反碼,結果保存到Rd。
         
        -----
        邏輯運算指令
         
        AND{}{S} ,,          邏輯與
        Rn與shifter_operand按位邏輯與,結果保存到Rd中。
        與1與會保持不變,與0與變為復位(變0)。
         
        EOR{}{S} ,,          邏輯異或,不同則為1,相同則為0
        Rn和shifter_operand進行按位邏輯異或,結果保存到Rd中。
        與0異或保持不變,與1異或會反轉。
         
        ORR{}{S} ,,          邏輯或
        Rn與shifter-_operand進行按位邏輯或,結果保存到Rd中。
        與0或會保持不變 ,與1或可以置位(変1)。
         
        BIC{}{S} ,,
        Rn的源碼與shifter_operand的反碼按位進行邏輯與,結果保存到Rd中。
         
        -----
        比較測試
         
        CMP{} ,          比較指令
        用Rn減去shifter_operand,自動更新cpsr的標志位。
         
        CMN{} ,          負數比較指令
        用Rn的原值減去shifter_operand的負數指(相當與兩者相加),自動更新cpsr的標志位。
         
        TST{} ,          測試指令
        將Rn和shifter_oerand進行按位邏輯與,自動更新cpsr的標志位。
         
        TEQ{} ,          測試相等指令
        將Rn和shifter_operand進行按位邏輯異或,自動更新cpsr的標志位。
         
        ---------------------------------------------
        數據傳送指令:
        MOV{cond}{S}      ,
         
        編碼格式:
        條件代碼標識           
        31-28                            20                15-12       11-0
        NZCV   00   1   1101    S    0000      Rd            shiter_operand
         
        cond:條件,指令只有在條件滿足時才執行。
         
        S:S標識,S(bit【20】)=1,更新cpsr。如果Rd=r15,CPSR=SPSR,如果Rd不是r15,根據傳送的數值設置cpsr的NZCV。如果S=0,不更新cpsr。
         
        Rd:確定目標寄存器
         
        shifter_operand:確定操作數,可以是立即數,寄存器,寄存器移位的形式。
         
        MVN{}{S}         ,
        傳送反碼,將shifter_operand按位取反傳送給Rd。
        編碼格式:
        條件代碼標識           
        31-28                             20                                   15-12                         11-0
        NZCV   00   1   1111       S               0000             Rd                       shiter_operand
        -------------------------------------------
        乘法指令
         
        編碼格式:
        31-28                         23-21     20          19-16            15-12            11-8                           3-0
        NZCV       0000         mul         S          Rd/RdHi       Rn/RdLo        Rs            1001          Rm
         
        mul:
         
        RdHi:RdLo        由RdHi(最高有效32位)和RdLo(最低有效32位)鏈接形成的64位數 
        [31:0]     表示只選取結果的最低有效32位。 
        :=          表示簡單的賦值。 
        S:S位,控制cpsr條件控制位的設置,具體設置如下: 
        產生32位結果,N=Rd【31】;64位結果的,N=RdHi【31】。 
        產生32位結果,Rd=0時,Z=1;64位結果的,RdHi和RdLo都為0,Z=1. 
        C設置成無意義的指,V不變。 
        MUL{}{S}     ,,     乘法指令 
        31-28                         23-21     20          19-16             11-8                           3-0 
        NZCV       0000         000        S           Rd                 Rs            1001          Rm 
        Rm*Rs,取結果的最低32位保存到Rd中。 
        MLA{}{S}     ,,,          乘-累加指令 
        31-28                         23-21     20          19-16      15-12       11-8                             3-0 
        NZCV       0000         001        S           Rd          Rn             Rs            1001          Rm 
        Rm*Rs,乘積加Rn,取結果的低32位保存到Rd。 
        UMULL{}{S}     ,,,     無符號長乘指令 
        31-28                         23-21     20          19-16            15-12          11-8                           3-0 
        NZCV       0000         100        S           RdHi            RdLo            Rs           1001          Rm
        Rm和Rs進行無符號相乘,結果低32位保存到RdLo,高32位保存到RdHi。
         
        UMLAL{}{S}     ,,,     無符號長乘-累加指令
        31-28                         23-21     20          19-16            15-12          11-8                           3-0
        NZCV       0000         101        S           RdHi            RdLo            Rs           1001          Rm
        Rm和Rs做無符號相乘,64位乘積與RdHi:RdLo相加,結果低32位保存到RdLo中,高32位保存到RdHi中。
         
        SMULL{}{S}     ,,,          有符號數長乘指令
        31-28                         23-21     20          19-16            15-12          11-8                           3-0
        NZCV       0000         110        S           RdHi            RdLo            Rs           1001          Rm
        Rm和Rs做有符號相乘,結果低32位保存到RdLo中,高32位保存到RdHi中。
         
        SMLAL{}{S}     ,,,          有符號數長乘-累加指令
        31-28                         23-21     20          19-16            15-12          11-8                           3-0
        NZCV       0000         111        S           RdHi            RdLo            Rs           1001          Rm
        Rm和Rs做有符號相乘,64位乘積和RdHi:RdLo相加,結果低32位保存到RdLo中,高32位保存到RdHi中。
         
        -------------------------------------------
        ARM加載存儲指令
         
        單寄存器加載/存儲指令:單數據傳送,字節,半字和字都可以。
        多寄存器加載/存儲指令:傳大數據,進程進入、退出、保存、恢復,內存數據拷貝。
        單寄存器交換指令:寄存器和存儲器進行數據交換,用于多處理器實現信號量。
         
        -----
        單寄存器指令:
         
        字:
        LDR:Load 加載:從內存到寄存器
        STR:Store 儲存:從寄存器到內存
        B:字節
        H:半字
        S:有符號
        T:用戶模式
         
        31-28                 25     24       23       22      21        20          19-16            15-12           11-0
        NZCV     0   X     L      P          U        I         W         S         Rn             Rd              addr_mode
        L:L=1,進行加載,否則是存儲
        P:P=1,使用預先變址尋址,否則使用過后變址尋址
        U:U=1,給出的偏移量被加到基址寄存器上,否則從中減去偏移量
        W:預先變址尋址,W=1,強制用作地址轉換的最終地址寫回基址寄存器;
        過后變址尋址,W=1,在進行傳送之前強制進行地址轉換。
         
        LDR{}     ,               字數據加載指令
        31-28             25     24          23                 21            19-16          15-12        11-0
        NZCV     01     L      P          U        0         W        1          Rn             Rd              addr_mode
        從內存中將一個32位字讀取到目標寄存器Rd。
         
        STR{}     ,               字數據存儲指令
        31-28             25     24          23                 21            19-16          15-12        11-0
        NZCV     01     L      P          U        0         W        0          Rn             Rd              addr_mode
        將寄存器Rd中一個32位的字數據寫入到一個內存單元。
         
        LDRB{}B     ,               字節數據加載指令
        31-28             25     24          23                 21            19-16          15-12        11-0
        NZCV     01     L      P          U        1         W        1          Rn             Rd              addr_mode
        將一個8位字節讀取到目標寄存器Rd。
         
        STRB{}B     ,               字節數據存儲指令
        31-28             25     24          23                 21            19-16          15-12        11-0
        NZCV     01     L      P          U        1         W        0          Rn             Rd              addr_mode
        從寄存器Rd中取出8位字節放入內存單元低8位,高位補0.
         
        LDRH{}H     ,               半字數據加載指令
        31-28                   24     23       21           19-16      15-12      11-8                                 4-0
        NZCV     010            P     U  1       W       1       Rn            Rd         addr_mode     1011          addr_mode
        從內存將一個16位的半字讀取到目標寄存器Rd。
         
        STRH{}H     ,               半字數據存儲指令
        31-28                   24     23       21           19-16      15-12      11-8                                 4-0
        NZCV     000            P     U  1       W       0       Rn            Rd         addr_mode     1011          addr_mode
        從寄存器取出指定的16位半字放入指令中指定的內存單元的低16位,將高位補0.
         
        LDR{}T     ,          用戶模式字加載指令
        31-28             25               23                                19-16            15-12            11-0
        NZCV     01     L      0       U        1     1      1         Rn             Rd              addr_mode
        從內存中將一個32位的字讀取到目標寄存器Rd。
        post_indexed_addressing_mode:使用后索引地址模式尋址。
         
        STR{}T     ,          用戶模式字存儲指令
        31-28             25               23                                19-16            15-12            11-0
        NZCV     01     L      0       U        0     1      0        Rn             Rd              addr_mode
        將寄存器Rd中的一個32位的字寫入到內存中。
        post_indexed_addressing_mode:使用后索引地址模式尋址。
         
        LDR{}BT     ,          用戶模式字節加載指令
        31-28             25               23                                19-16            15-12            11-0
        NZCV     01     L      0       U        1     1      1         Rn             Rd              addr_mode
        從內存讀取一個8位字節到目標寄存器Rd。
        post_indexed_addressing_mode:使用后索引地址模式尋址。
         
        STR{}BT    ,,
        用戶模式字節存儲指令
        31-28             25               23                                19-16            15-12            11-0
        NZCV     01     L      0       U        1     1      0        Rn             Rd              addr_mode
        將寄存器Rd中的一個8位的字節寫入到內存中。
        post_indexed_addressing_mode:使用后索引地址模式尋址。
         
        LDR{}SB     ,          有符號字節傳送指令
        31-28                24      23     22      21              19-16        15-12               11-0
        NZCV     000     P       U      I        W      1        Rn             Rd              addr_mode
        將一個8位的字節讀取到目標寄存器Rd。
         
        LDR{}SH     ,          有符號半字傳送指令
        31-28                24      23     22      21              19-16        15-12            11-8      11-0
        NZCV     000     P       U      I        W      1        Rn             Rd          1111       addr_mode
        將一個16位的半字節讀取到目標寄存器Rd。
         
        -----
        多寄存器加載存儲指令
         
        主要用途現場保護,數據復制,參數傳遞,有8中模式(address_mode):
        數據塊傳輸:
        IA:每次傳送后地址加4
        IB:每次傳送前地址加4
        DA:每次傳送后地址減4
        DB:每次傳送前地址減4
        堆棧操作:
        FD:滿遞減堆棧
        ED:空遞減堆棧
        FA:滿遞增堆棧
        EA:空遞增堆棧
         
        多寄存器內存字數據傳送指令:
         
        LDM{}          {!},
        31-28                24      23               21              19-16        15-0
        NZCV     100     P       U      0        W      1        Rn           register_list
        將數據從連續的內存單元中讀取到寄存器列表中。
        address_mode:指令的尋址方式,確定PUW位
        Rn:基址寄存器
        。涸O置W位
        registers:被加載的寄存器列表
         
        STM{}          {!},
        31-28                24      23               21              19-16        15-0
        NZCV     100     P        U      0        W      0        Rn           register_list
        將寄存器列表中各寄存器數據寫入到連續的內存單元中。
        address_mode:指令的尋址方式,確定PUW位
        Rn:基址寄存器
        。涸O置W位
        registers:被加載的寄存器列表
         
        用戶模式多寄存器內存字數據傳送指令:
         
        LDM{}          ,
        31-28                24      23               21              19-16        15-0
        NZCV     100     P        U      1        W      1        Rn           register_list
        將數據從連續的內存單元讀取到指令中指定的寄存器列表中的各寄存器。
         
        STM{}          ,
        31-28                24      23               21              19-16         15-0
        NZCV     100     P        U      0        W      0        Rn           register_list
        將寄存器列表中的各寄存器數值寫入到內存單元。
         
        帶狀態寄存器的多寄存器字數據裝載指令:
         
        LDM{}          {!},
        31-28                24      23               21              19-16        15-0
        NZCV     100     P        U      1        W      1        Rn           register_list
        將數據從連續的內存單元讀取到寄存器列表。
         
        -----
        通用寄存器和存儲器內容交換指令
        用于進程同步
         
        SWP{}     ,,[]
        31-28                            19-16          15-12           11-8                                   3-0
        NZCV     00010000         Rn                 Rd             SBZ           1001                Rm
        Rn:內存單元地址寄存器
        Rd:確定指令的目標寄存器
        Rm:包含將要被存儲到內存單元中的數據的寄存器
        將一個內存單元【Rn】中的字數據讀取到寄存器Rd中,同時將寄存器Rm的字數據寫入到內存單元【Rn】中。
         
        SWP{}B     ,,[]
        31-28                            19-16          15-12           11-8                                   3-0
        NZCV     00010100         Rn                 Rd             SBZ           1001                Rm
        Rn:內存單元地址寄存器
        Rd:確定指令的目標寄存器
        Rm:包含將要被存儲到內存單元中的數據的寄存器
        將一個內存單元【Rn】中的字節數據讀取到寄存器Rd中,同時將寄存器Rm的字節寫入到內存單元【Rn】中。
         
        ------------------------------------------------
        程序狀態寄存器訪問指令:
        ARM提供兩條指令,直接控制程序狀態寄存器psr。
         
        將程序狀態寄存器的值送到通用寄存器
        MRS{}     ,CPSR/SPSR
        31-28                       22                19-16            15-12             12-11
        NZCV     00010        R       00       SB0           Rd                SBZ
        R:如果R=1,Rd=SPSR;R=0,Rd=CPSR
         
        將通用狀態寄存器的值送到程序狀態寄存器
        MSR{}     CPSR_/SPSR_,
        31-28                       22                19-16               15-12              8-11                         3-0
        N ZCV     00010        R       10       FSXC         SB0               SBZ        0000        Rm
        R:如果R=1,SPSR=Rd;R=0,CPSR =Rd
         
        將立即數送給程序狀態寄存器
        MSR{}     CPSR_/SPSR_, #
        31-28                       22                19-16            15-12              11-8                        7-0
        N ZCV     00110        R       10    FSXC          SB0                                        8_bit_immediate
        R:如果R=1,SPSR=immediate;R=0,CPSR=immediate
         
        域標志位field:
        F:標志位掩碼域
        S:狀態位掩碼域
        X:擴展位掩碼域
        C:控制位掩碼域
         
        ------------------------------------------------
        異常產生指令
         
        SWI{}     
        31-28                      23-0
        N ZCV     1111        immed_24
        immed_24:24位立即數。
        SWI用于產生軟中斷,實現從用戶模式變換到管理模式,cpsr保存到管理模式的spsr,執行轉移到SWI向量。
         
        ---------------------------------------------------------------------
        Arm偽指令:
         
        ADR:裝載程序相關或寄存器相關地址(小范圍)到寄存器。
        ADRL:裝載程序相關或寄存器相關地址(中等范圍)到寄存器。
        MOV32:裝載32位常數或地址到寄存器。
        LDR:裝載32位常數或地址到寄存器。
        NOP:執行一條空操作,用于延時。
         
        ADR{cond}{.W}       register,lable
        Cond:指令執行條件
        .W:指定指令寬度
        Register:目標寄存器
        Label:基于PC或具體寄存器的表達式
         
        ADRL{cond}         register,label
        Cond:指令執行條件
        Register:目標寄存器
        Label:基于PC或具體寄存器的表達式
         
        LDR{cond}{.W}        register,=[expr|label-expr]
        Cond:執行條件
        .W:指令寬度
        Register:目標寄存器
        Expr:32位常量表達式
        Label-expr:一個程序相關或聲明為外部的表達式。
         
        NOP
        可以用mov   ro,ro替換
         
        -------------------------------------------------------------------------------------------------------------------
        arm處理器尋址方式有9種:
        1.寄存器尋址(寄存器Rn中存放的數就是操作數)
        2.立即數尋址(立即數#0xXXXXXXXX作為操作數)
        3.寄存器移位尋址(寄存器中存放的值進行移位操作之后作為操作數)
        4.寄存器間接尋址([Rn],將Rn寄存器中存放的值作為操作數的地址)
        5.基址尋址([Rn,#0xXXX],將Rn寄存器中存放的值加上立即數作為操作數的地址)
        6.多寄存器尋址({Rn-Rm,Rk},在大括號中可以放多個寄存器,進行批量操作)
        7.堆棧尋址
        8.塊拷貝
        9.相對尋址
         
        寄存器移位方式有9種:
        ASR     #n/:算術右移
        LSL     #n/:邏輯左移
        LSR     #n/:邏輯右移
        ROR     #n/:循環右移
        RRX:帶擴展的循環右移一位
        #n表示立即數,表示偏移量寄存器。
         
        arm指令分類:
        數據處理指令(算數運算、位運算、比較測試、數據傳送)
        乘法指令
        跳轉指令
        加載存儲指令(load/store)
        寄存器訪問指令(程序狀態寄存器、通用寄存器)
        異常中斷指令
        協處理指令
        信號量指令
        偽指令(arm偽指令,thumb偽指令、符號定義偽指令、數據定義偽指令、報告偽指令、匯編控制偽指令、其他偽指令)
         
        arm指令格式:
        {}{S}      ,{,   operand2}
        <>:表示必須
        {}:表示可選
        opcode:指令助記符
        Rd:目標寄存器
        Rn:源寄存器(第一操作數寄存器)
        operand2:第二操作數(可以是立即數、寄存器、寄存器移位)
        cond為指令執行條件
         
        寄存器的高四位為條件cond:
        31
        30
        29
        28
         
        N
        Z
        C
        V
         
        N:=1,負數
        Z:=1,零
        C:=1,進位
        V:=1,溢出
         
        條件碼助記符有16種:
        31-28
        助記符
        說明
        檢測條件
        0000
        EQ
        相等 /等于零
        Z=1
        0001
        NE
        不等
        Z=0
        0010
        CS/HS
        進位 /無符號數大于或等于
        C=1
        0011
        CC/LO
        無進位 /無符號數小于
        C=0
        0100
        MI
        負數
        N=1
        0101
        PL
        正數 /零
        N=0
        0110
        VS
        溢出
        V=1
        0111
        VC
        未溢出
        V=0
        1000
        HI
        無符號數大于
        C=1&Z=0
        1001
        LS
        無符號數小于或等于
        C=0&Z=1
        1010
        GE
        有符號數大于或等于
        N=V
        1011
        LT
        有符號數小于
        N !=V
        1100
        GT
        有符號數大于
        Z=0 & N=V
        1101
        LE
        有符號數小于或等于
        Z=1 | N !=V
        1110
        AL
        總執行
        任何狀態
        1111
        NV
        從不執行
          
         
        指令限制:
        指令都是32位的等寬,造成了分配出來存放立即數的位數不同,所以帶立即數的數據處理指令受到限制。
         
        數據處理指令(16種)
         
        條件位
         
         
         
         
         
         
         
        指令助記符
         
        CSPR
         
        源寄存器
         
        目標寄存器
         
        第二操作數
         
        31—28
         
        27
         
        26
         
        25
         
        24
         
        23
         
        22
         
        21
         
        20
         
        19——16
         
        15——12
         
        11——0
         
        NZCV
         
        0
         
        0
         
        I
         
         
         
         
         
         
         
         
         
        S
         
        Rn
         
        Rd
         
        立即數
         
        跳轉指令B、帶連接的跳轉指令BL
         
        條件位
         
         
         
         
         
         
         
         
         
        24位跳轉地址
         
        31—28
         
        27
         
        26
         
        25
         
        24
         
        23——0
         
        N Z C V
         
        1
         
        0
         
        1
         
        L
         
        立即數
         
        帶狀態切換的鏈接跳轉指令BLX
         
        條件位
         
         
         
         
         
         
         
         
         
        24位跳轉地址
         
        31—28
         
        27
         
        26
         
        25
         
        24
         
        23——0
         
        N Z C V
         
        1
         
        0
         
        1
         
        H
         
        立即數
         
        軟中斷指令SWI
         
        條件位
         
         
         
         
         
         
         
         
         
        24位操作數
         
        31—28
         
        27
         
        26
         
        25
         
        24
         
        23——0
         
        N Z C V
         
        1
         
        1
         
        1
         
        1
         
        立即數
         
        第二操作數是立即數時:
        必須是一個8位的常數經過偶數位循環移位得到。
         
        arm偽指令:
         
        ADR:將基于PC的相對偏移地址的值讀取到寄存器中。
        ADR{}      Rd,addr_expr
         
        ADRL:將基于PC相對偏移地址的值,或基于寄存器相對偏移地址的值讀取到寄存器中。
        ADRL{}      Rd,addr_expr
         
        LDR:加載32位立即數或一個地址到指定寄存器。
        LDR{}      Rd,addr_expr/#n
         
        注意:LDR既可以作為arm偽指令,也可以作為加載指令。
         
        NOP:空操作偽指令,用于延時。
        NOP
         
        通用偽指令
         
        以下偽指令為編譯器定義,所以可以通用,都是以.開頭。
         
        .equ   symbol, expr
        .set 同.equ
        Symbol:要指定的名稱
        Expr:常量或
        相當于宏定義,用symbol來代替expr。
         
        .global   symbol
        .globl同.global
        Symbol:要聲明的全局符號
        在一個文件中聲明一個全局變量或全局函數,在別的文件能夠訪問
         
        .extern   symbol
        Symbol:要聲明的外部標號
         
        .ltorg
        .pool
        聲明一個數據緩沖池的開始。
         
        .byte   expr{,   expr}…
        Expr:數字表達式或程序中的標號。
        定義一個字節,相當于定義一個char類型
         
        .hword   expr{,  expr}…
        .short   expr{,   expr}…
        Expr:數字表達式或程序中的標號
        定義一個半字,兩個字節,相當于short int。
         
        .word   expr{,   expr}…
        .int   expr{,   expr}…
        .long   expr{,   expr}…
        Expr:數字表達式或程序中的標號
        定義一個字,四個字節,相當于int,long int(32位)
         
        .ascii    expr{,   expr}…
        .asciz   expr{,   expr}…
        .string   expr{,   expr}…
        Expr:表示字符串
        定義一個字符串,相當于char   *
         
        .quad   expr{,   expr}…
        Expr:數字表達式
        定義雙字,相當于八個字節,long   int(64位)
         
        .zero  
        分配number_of_bytes字節的數據空間,用0填充內存
         
        .space      {,   }
        .skip同.space
        分配number_of_bytes字節數據空間,用fill_byte填充,缺省用0.
         
        .fill   repeat{,   size}{,   value}
        Repeat:重復填充的次數
        Size:每次填充的字節,默認為1
        Value:所填充的數據,默認為0
        定義重復內存單元
         
        .double   expr{.   Expr}…
        Expr:為32位的單精度浮點數
        定義一個雙精度浮點數
         
        .arm
        .code32
        表示是arm指令,32位指令
         
        .thumb
        .16
        表示thumb指令,16位指令
         
        .section   {,   “”}
        Section_name:段名稱,可以自定義,也可以使用預定義的(test,data,bss)。
        Flags:elf文件格式的標志,a(可加載段,可讀),w(可寫段),x(可執行段)。
        定義一個段
         
        .text
        代碼段
         
        .data
        數據段
         
        .bss
        Bss段
         
        .end
        表示源文件的結束,如果之后還有代碼不會被編譯執行
         
        .include   “filename“
        將指定的文件filename在使用的位置展開(一般是頭文件)
         
        .incbin   “file”[,   skip[,   count]]
        File:一個二進制文件
        Skip:從文件開頭跳過skip個字節
        Count:讀取的字數
        將一個原封不動的二進制文件編譯到當前文件中。
         
        .align   [ab***pr1,   ab***pr2]
        Ab***pr1:表示對齊方式,(4,8,16,32等)
        Ab***pr2:表示填充的值
        指定數據對其方式,以ab***pr1方式對齊,在未使用的區域用ab***pr2填充。
        .balign和.align相同
         
        .if
        .else
        根據表達式的值決定下面的代碼是否編譯,endif表示結束條件判斷。
         
        .ifdef
        .else
        .endif
        條件編譯偽操作,滿足條件就編譯。
         
        .macro    宏名   參數列表
        宏體
        .exitm或.endm     @表示宏結束
         
        .rept   重復次數
             數據定義
        .endr          @結束重復定義
        用來重復定義一個或幾個數據
         
        ARM匯編程序設計的格式
        [:]   []          @comment
        Label:標號
        Instruction:匯編指令
        Pseudo-instruction:偽指令
        Directive:偽操作
        @:注釋
         
        C和匯編混合編程
         
        只有C和匯編都遵循標準,才能相互調用,ATPCS就是一個公共標準。
         
        C和匯編混合引用的內容:
        函數;
        變量。
         
        C和匯編混合引用的方式:
        C內嵌匯編;
        C和匯編相互引用。
         
        ATPCS(arm/thumb程序調用標準):
        規定寄存器的使用;
        規定函數傳參方式;
        規定棧使用方法。
         
        1.     寄存器的使用
        未備份寄存器:
        R0-R3:作為函數傳遞的參數值,想用就用,可記作A1-A3;
         
        備份寄存器:
        R4-R11:arm狀態下保存局部變量,寄存器變量必須保護,可記作V1-V8;
        使用之前要先保存,使用之后要恢復(壓棧出棧)。
         
        有臨時第二功能:
        R12:函數調用時用來臨時保堆棧指針,函數返回時進行出棧,記作IP
         
        第二功能寄存器:
        R13-R15:有第二功能的寄存器,以第二功能為主。
         
        2.函數傳參方式:
        參數個數可變的子程序參數調用規則:
        如果參數個數不超過四個,用R0-R3來傳遞;
        如果參數個數超過四個,多出的參數使用棧來傳遞參數。
         
        參數個數固定的子程序參數傳遞規則:
        如果系統不包含double(64位)類型,如果不超過四個參數,使用R0-R3來傳遞,超過的部分使用棧來傳遞。
        如果包含了double(64位)類型,需要8字節(64位)對齊,也就是說double類型只能放在R的偶數(4字節)+奇數(4字節)來存放,而不能使用奇數+偶數來存放。
         
        3.棧的使用方法:
        過程調用標準規定數據棧為FD類型,并且對數據棧的操作時要求8字節對齊。
         
        -------------------------------------------------
        協處理指令
         
        ARM支持多達16個協處理器,ARM協處理器指令主要用于ARM處理器初始化ARM協處理器的數據處理操作,以及在ARM處理器的寄存器和協處理器的寄存器之間傳送數據,以及在ARM協處理器的寄存器和存儲器之間傳送數據
        ARM協處理器有5條指令:
        CDP:協處理器數操作指令
        LDC:協處理器數據加載指令
        STC:協處理器數據存儲指令
        MCR:ARM處理器寄存器到協處理器寄存器數據傳送指令
        MRC:協處理器寄存器到ARM處理器寄存器數據傳送指令
         
        MCR指令格式:
        MCR{}   協處理器編碼,協處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協處理器操作碼2
        將ARM處理器的源寄存器中的數據傳送到協處理器的目的寄存器1和目的寄存器2.
        。。。。。。
        -------------------------------------------------
        信號量指令
        。。。。。。
         
        關閉窗口
        上一篇:arm裸機編程

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮