新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編指令的一些總結

        ARM匯編指令的一些總結

        作者: 時間:2016-11-28 來源:網絡 收藏
        ARM匯編指令很多,但是真正常用的不是很多,而且需要認真琢磨的又更少了。

        比較有用的是MOVBBLLDRSTR

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

        還是通過具體匯編代碼來學習吧。

        @ disable watch dog timer

        movr1, #0x53000000//立即數尋址方式

        movr2, #0x0

        strr2, [r1]

        MOV沒有什么好說的,只要掌握幾個尋址方式就可以了,而且ARM的尋址方式比386的簡單很多。立即數尋址方式,立即數要求以“#”作前綴,對于十六進制的數,還要求在#后面加上0x或者&。0x大家很好理解。有一次我碰到了&ff這個數,現在才明白跟0xff是一樣的。

        STR是比較重要的指令了,跟它對應的是LDR。ARM指令集是加載/存儲型的,也就是說它只處理在寄存器中的數據。那么對于系統存儲器的訪問就經常用到STR和LDR了。STR是把寄存器上的數據傳輸到指定地址的存儲器上。它的格式我個人認為很特殊:

        STR(條件)源寄存器,<存儲器地址>

        比如STR R0, [R1],意思是R0-> [R1],它把源寄存器寫在前面,跟MOV、LDR都相反。

        LDR應該是非常常見了。LDR就是把數據從存儲器傳輸到寄存器上。而且有個偽指令也是LDR,因此我有個百思不得其解的問題。看這段代碼:

        movr1, #GPIO_CTL_BASE

        addr1, r1, #oGPIO_F

        ldrr2,=0x55aa// 0x55aa是個立即數啊,前面加個=干什么?

        strr2, [r1, #oGPIO_CON]

        movr2, #0xff

        strr2, [r1, #oGPIO_UP]

        movr2, #0x00

        strr2, [r1, #oGPIO_DAT]

        對于當中的ldr那句,我就不明白了,如果你把=去掉,是不能通過編譯的。我查了一些資料,個人感覺知道了原因:這個=應該表示LDR不是ARM指令,而是偽指令。作為偽指令的時候,LDR的格式如下:

        LDR寄存器,=數字常量/Label

        它的作用是把一個32位的地址或者常量調入寄存器。嗬嗬,那大家可能會問,

        “MOV r2,#0x55aa”也可以啊。應該是這樣的。不過,LDR是偽指令啊,也就是說編譯時編譯器會處理它的。怎么處理的呢?——規則如下:如果該數字常量在MOV指令范圍內,匯編器會把這個指令作為MOV。如果不在MOV范圍中,匯編器把該常量放在程序后面,用LDR來讀取,PC和該常量的偏移量不能超過4KB。

        這么一說,雖然似懂非懂,但是能夠解釋這個語句了。

        然后說一下跳轉指令。ARM有兩種跳轉方式。

        (1)mov pc <跳轉地址〉

        這種向程序計數器PC直接寫跳轉地址,能在4GB連續空間內任意跳轉。

        (2)通過BBLBLXBX可以完成在當前指令向前或者向后32MB的地址空間的跳轉(為什么是32MB呢?寄存器是32位的,此時的值是24位有符號數,所以32MB)。

        B是最簡單的跳轉指令。要注意的是,跳轉指令的實際值不是絕對地址,而是相對地址——是相對當前PC值的一個偏移量,它的值由匯編器計算得出。

        BL非常常用。它在跳轉之前會在寄存器LR(R14)中保存PC的當前內容。BL的經典用法如下:

        blNEXT; 跳轉到NEXT

        ……

        NEXT

        ……

        mov pc, lr; 從子程序返回。

        最后提一下Thumb指令。ARM體系結構還支持16位的Thumb指令集。Thumb指令集是ARM指令集的子集,它保留了32位代碼優勢的同時還大大節省了存儲空間。由于Thumb指令集的長度只有16位,所以它的指令比較多。它和ARM各有自己的應用場合。對于系統性能有較高要求,應使用32位存儲系統和ARM指令集;對于系統成本和功耗有較高要求,應使用16位存儲系統和ARM指令集。



        關鍵詞: ARM匯編指

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 常宁市| 平南县| 甘泉县| 沙田区| 普兰县| 河东区| 墨竹工卡县| 德保县| 金秀| 平谷区| 阳高县| 霍林郭勒市| 阜平县| 舒兰市| 乌兰察布市| 阿拉善左旗| 建平县| 乳源| 西畴县| 荆门市| 涟水县| 河北省| 贺州市| 东平县| 中超| 浏阳市| 洪泽县| 米脂县| 上虞市| 渭南市| 永康市| 平江县| 沈阳市| 谢通门县| 定襄县| 南开区| 衡水市| 云和县| 虎林市| 朝阳区| 原平市|