新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux三常用ARM匯編指令

        嵌入式Linux三常用ARM匯編指令

        作者: 時間:2016-11-20 來源:網絡 收藏
        嵌入式開發中,匯編程序常常用于非常關鍵的地方,比如系統啟動時初始化,進出中斷時的環境保護,恢復等對性能有要求的地方。

        ARM指令集可以分為六大類,分別為數據處理指令、Load/Store指令、跳轉指令、程序狀態寄存器處理指令、協處理器指令和異常產生指令。
        ARM指令使用的基本格式如下:
        〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉}
        opcode操作碼;指令助記符,如LDR、STR等。
        cond可選的條件碼;執行條件,如EQ、NE等。
        S可選后綴;若指定“S”,則根據指令執行結果更新CPSR中的條件碼。
        Rd目標寄存器。
        Rn存放第1操作數的寄存器。
        operand2第2個操作數

        arm的尋址方式如下:
        立即尋址
        寄存器尋址
        寄存器間接尋址
        基址加偏址尋址
        堆棧尋址
        塊拷貝尋址
        相對尋址
        這里不作詳細描述,可以查閱相關文檔。

        數據處理指令
        Load/Store指令
        程序狀態寄存器與通用寄存器之間的傳送指令
        轉移指令
        異常中斷指令
        協處理器指令


        在S3C2410、S3C2440的數據手冊中對各種匯編指令有詳細的描述;這里只對較常見的作寫介紹。
        1、相對跳轉指令:b、bl
        這兩條指令的不同之處在于bl指令除了跳轉之外,還將返回地址(bl的下一條指令的地址)保存在lr寄存器中。
        這兩條指令的可跳轉范圍是當前指令前后32M。

        bfuna
        ....
        funa:
        bfunb
        ....
        funb:
        ....

        本文引用地址:http://www.104case.com/article/201611/318758.htm


        2、數據傳送指令mov,地址讀取偽指令ldr
        mov指令可以把一個寄存器的值賦給另外一個寄存器,或者把一個常數賦給寄存器。
        movr1,r2
        /*上面是r1=r2*/
        movr1,#1024
        /*r1=1024*/

        mov傳送的常數必須能用立即數來表示。當不能用立即數表示時,可以用ldr命令來賦值。
        ldr是偽命令,不是真實存在的指令,編譯器會把它擴展成真正的指令;如果該常數能用“立即數”來表示,則使用mov指令,否則編譯時將該常數保存在某個位置,使用內存讀取指令把它讀出來。
        ldrr1,=1024
        /*r1=1024*/

        3、內存訪問指令ldr、str、ldm、stm
        ldr既可以指低至讀取偽指令,也可以是內存訪問指令。當他的第二個參數前面有=時標偽指令,否則表內存訪問指令。
        ldr指令從內存中讀取數據到寄存器,str指令把寄存器的指存儲到內存中,他們的操作數都是32位的。

        ldrr1,[r2,#4]/*將地址為r2+4的內存單元數據讀取到r1中*/
        ldrr1,[r2]/*將地址為r2的內存單元數據讀取到r1中*/
        ldrr1,[r2],#4/*將地址為r2的內存單元數據讀取到r1中,然后r2=r2+4*/
        strr1,[r2,#4]/*將r1的數據保存到地址為r2+4的內存單元中*/
        strr1,[r2]/*。。。。*/
        strr1,[r2],#4/*將r1的數據保存到地址為r2的內存單元,然后r2=r2+4*/

        多寄存器傳送指令可以用一條指令將16個可見寄存器(R0~R15)的任意子集合(或全部)存儲到存儲器或從存儲器中讀取數據到該寄存器集合中。與單寄存器存取指令相比,多寄存器數據存取可用的尋址模式更加有限。多寄存器存取指令的匯編格式如下:

        LDM/STM{}Rn{!},

        4、加減指令add、sub

        addr1,r2,#1/*r1=r2+1*/
        subr1,r2,#1/*r1=r2-1*/

        5、程序狀態寄存器的訪問指令msr,mrs

        ARM指令中有兩條指令,用于在狀態寄存器和通用寄存器之間傳送數據。修改狀態寄存器一般是通過“讀取-修改-寫回”三個步驟的操作來實現的。這兩條指令分別是:
        狀態寄存器到通用寄存器的傳送指令(MRS)
        通用寄存器到狀態寄存器的傳送指令(MSR)

        其匯編格式如下:
        MRS{}Rd,CPSR|SPSR
        其匯編格式如下:
        MSR{}CPSR_f|SPSR_f,#<32-bitimmediate>
        MSR{}CPSR_|SPSR_,Rm

        msrcpsr,r0/*r0到cpsr中*/
        mrsr0,cpsr/*cpsr到r0中*/

        6、邏輯運算指令

        AND邏輯"與"操作指令
        指令格式:
        AND{cond}{S}Rd,Rn,operand2

        AND指令將操作數operand2與Rn的值按位邏輯"與",結果存放到目的寄存器Rd中。若設置S,則根據運算結果影響N、Z位,在計算第二操作數時,更新C位,不影響V位(指令ORR、EOR、BIC對標志位的影響同AND指令)。

        指令示例:
        ANDSR1,R1,R2;R1=R1&R2,并根據運算的結果更新標志位
        ANDR0,R0,#0x0F;R0=R0&0x0F,取出R0最低4位數據。

        ORR邏輯"或"操作指令
        指令格式:ORR{cond}{S}Rd,Rn,operand2ORR指令將操作數operand2與Rn的值按位邏輯"或",結果存放到目的寄存器Rd中。指令示例:
        ORRSR1,R1,R2;R1=R1|R2,并根據運算的結果更新標志位

        ORRR0,R0,#0x0F;R0=R0|0x0F,將R0最低4位置1,其余位不變。

        BIC位清除指令
        指令格式:
        BIC{cond}{S}Rd,Rn,operand2

        BIC指令將Rn的值與操作數operand2的反碼按位邏輯"與",結果存放到目的寄存器Rd中。指令示例:BICR0,R0,#0x0F;將R0最低4位清零,其余位不變。

        7、異常中斷指令
        異常中斷指令可以分為一下兩種:
        軟件中斷指令(SWI)
        斷點指令(BKPT—僅用于v5T體系)
        軟件中斷指令SWI用于產生SWI異常中斷,用來實現在用戶模式下對操作系統中特權模式的程序的調用;斷點中斷指令BKPT主要用于產生軟件斷點,供調試程序用。

        8、其他偽指令

        .externmain
        .text
        .global_start
        _start:

        .extern定義一個外部符號(可以是變量也可以是函數),上面的代碼表示表文本文件中引用的main是一個外部函數。

        .text表示下面的語句都屬于代碼段

        .global將本文件中的某個程序標號定義為全局的,如‘_start’就是個全局函數



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 长治市| 富裕县| 安庆市| 克东县| 涟水县| 平谷区| 鄂尔多斯市| 塔河县| 普格县| 元江| 瓮安县| 抚远县| 安远县| 蓬溪县| 西青区| 芷江| 鹿邑县| 灵武市| 文成县| 惠州市| 炉霍县| 慈利县| 济南市| 平舆县| 建湖县| 邯郸县| 纳雍县| 通州市| 云林县| 偃师市| 云龙县| 沂水县| 永善县| 同心县| 台安县| 新余市| 梅州市| 麻江县| 堆龙德庆县| 娄烦县| 阜新市|