在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux三常用ARM匯編指令

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

            作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
            嵌入式開發(fā)中,匯編程序常常用于非常關(guān)鍵的地方,比如系統(tǒng)啟動時初始化,進出中斷時的環(huán)境保護,恢復(fù)等對性能有要求的地方。

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

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

            數(shù)據(jù)處理指令
            Load/Store指令
            程序狀態(tài)寄存器與通用寄存器之間的傳送指令
            轉(zhuǎn)移指令
            異常中斷指令
            協(xié)處理器指令


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

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

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


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

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

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

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

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

            LDM/STM{}Rn{!},

            4、加減指令add、sub

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

            5、程序狀態(tài)寄存器的訪問指令msr,mrs

            ARM指令中有兩條指令,用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。修改狀態(tài)寄存器一般是通過“讀?。薷模瓕懟?rdquo;三個步驟的操作來實現(xiàn)的。這兩條指令分別是:
            狀態(tài)寄存器到通用寄存器的傳送指令(MRS)
            通用寄存器到狀態(tài)寄存器的傳送指令(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指令將操作數(shù)operand2與Rn的值按位邏輯"與",結(jié)果存放到目的寄存器Rd中。若設(shè)置S,則根據(jù)運算結(jié)果影響N、Z位,在計算第二操作數(shù)時,更新C位,不影響V位(指令ORR、EOR、BIC對標(biāo)志位的影響同AND指令)。

            指令示例:
            ANDSR1,R1,R2;R1=R1&R2,并根據(jù)運算的結(jié)果更新標(biāo)志位
            ANDR0,R0,#0x0F;R0=R0&0x0F,取出R0最低4位數(shù)據(jù)。

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

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

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

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

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

            8、其他偽指令

            .externmain
            .text
            .global_start
            _start:

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

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

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



            關(guān)鍵詞: 嵌入式LinuxARM匯編指

            評論


            技術(shù)專區(qū)

            關(guān)閉