新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Android的ARM匯編語言系列之四:ARM處理器的尋址方式

        基于Android的ARM匯編語言系列之四:ARM處理器的尋址方式

        作者: 時間:2016-11-09 來源:網絡 收藏
        章節列表

        之一:ARM匯編語言開篇
        之二:C/C++程序生成ARM匯編程序的過程分析
        之三:ARM匯編語言程序結構
        之四:ARM處理器的尋址方式
        之五:ARM指令集與Thumb指令集
        之六:NEON指令集與VFP指令集

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

        處理器的尋址方式是通過指令給出的地址碼字段來尋找真實操作數地址的方式,ARM處理器支持9中尋址方式。

        一 立即尋址

        立即尋址指令后面的地址碼部分為立即數(常量或常數),立即尋址多用于給寄存器賦值。

        舉例

        MOV RO, #1234

        指令執行后,R0=1234。

        寄存器尋址

        寄存器尋址中,操作數在寄存器中,指令執行時直接從寄存器中取值進行操作。

        舉例

        MOV R0, R1

        指令執行后,R0=R1。

        三 寄存器移位尋址

        寄存器移位尋址是ARM指令集特有的尋址方式,和寄存器尋址類似,只是操作前需要對寄存器操作數進行移位操作。

        • LSL:邏輯左移,移位后寄存器空出的低位補0。
        • LSR:邏輯右移,移位后寄存器空出的高位補0。
        • ASR:算術右移,移位過程中,符號位保持不變,如果源操作數是正數,則空出的高位補0,否則補1.
        • ROR:循環右移,移位后移除的低位填入空出的高位。
        • RRX:帶擴展的循環右移,操作數右移一位,移位空出的高位用C標志的值填充。

        舉例

        MOV R0, R1, LSL #2

        R1寄存器左移兩位賦值給R0,指令執行后,R0=R1*4。

        四 寄存器間接尋址

        寄存器間接尋址中地址碼給出的寄存器是操作數的地址指針,所需的操作數保存在寄存器指定的存儲單元中。

        舉例

        LDR R0, [R1]

        將R1寄存器的數值作為地址,取出此地址中的值賦給R0寄存器。

        五 基址尋址

        基址尋址是將地址碼給出的基址寄存器和偏移量相加,形成操作數的有效地址,所需的操作數保存在有效地址所指向的存儲單元中。基址尋址多用于查表和數組訪問等操作。

        舉例

        LDR R0, [R1, #-4]

        將寄存器R1的數組減去4作為地址,取出此地址中的值賦值給R0。

        六 多寄存器尋址

        多寄存器尋址一條指令最多可以完成16個通用寄存器的傳送。

        舉例

        LDMIA R0, {R1, R2, R3, R4}

        LDM是數據加載指令,指令的后綴IA表示每次執行完加載操作后R0寄存器的值自增1個字。指令執行后,R1=[R0],R2=[R0+#4],R3=[R0+#8],R4=[R0+#12]。

        七 堆棧尋址

        堆棧尋址是ARM處理器特有的一種尋址方式,堆棧尋址使用特定的指令來完成。

        • LDMFA/STMFA
        • LDMEA/STMEA
        • LDMFD/STMFD
        • LDMED/STMED

        舉例

        STMFD SP1, {R1-R7, LR}

        將R1-R7,LR入棧,多用于保存子程序現場。

        LDMFD SP1, {R1-R7, LR}

        將數據出棧,放入R0-R7,LR寄存器,多用于恢復程序現場。

        八 塊拷貝尋址

        塊拷貝尋址可實現連續地址數據從存儲器的某一位置拷貝到另一位置。

        • LDMIA/STMIA
        • LDMDA/STMDA
        • LDMIB/STMIB
        • LDMDB/STMDB

        舉例

        LDMIA R0!, {R1-R3}

        從R0寄存器的存儲單元中讀取3個字到R1-R3寄存器中。

        STMIA R0!, {R1-R3}

        存儲在R1-R3寄存器的內容到R0指向ed存儲單元。

        九 相對尋址

        相對尋址以程序計數器PC的當前值為基地址,指令中的地址標號作為偏移量,將兩者相加之后得到的操作數作為有效地址。

        舉例

        BL NEXT...NEXT:...

        BL NEXT是跳到NEXT標號處執行,這里的BL就是采用相對尋址,標號NEXT是偏移量。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 观塘区| 宕昌县| 尉犁县| 香港 | 佛冈县| 托克逊县| 万年县| 张掖市| 汾西县| 上犹县| 金川县| 裕民县| 屏东市| 通河县| 庆安县| 辽宁省| 岳西县| 抚远县| 隆化县| 遵化市| 同心县| 建水县| 铁力市| 湟源县| 西平县| 苏尼特右旗| 东阿县| 沛县| 榆中县| 建阳市| 宜兰市| 新蔡县| 油尖旺区| 青阳县| 永寿县| 乌拉特后旗| 开远市| 麻江县| 宽城| 新乐市| 鲜城|