新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編編程基礎之六-其它尋址模式與其它指令

        ARM匯編編程基礎之六-其它尋址模式與其它指令

        作者: 時間:2016-11-27 來源:網絡 收藏

        STMED、STMEA、STMFD、STMFA和LDMED、LDMEA、LDMFD、LDMFA就是所謂的堆棧尋址指令。由此可見:為了對程序員體貼入微,ARM指令集的設計者設計了堆棧尋址指令,其實質就是多寄存尋址指令的快捷方式。

        4、寄存器移位尋址

        寄存器移位尋址是ARM指令集特有的尋址方式。當第2個操作數是寄存器移位方式時,第2個寄存器操作數在與第1個操作數結合之前,選擇進行移位操作。例如:

        MOV R0,R2,LSL #3 表示將R2的值邏輯左移3位,結果放入R0,即是R0=R2×8。

        移位的方式有以下幾種:

        LSL(logic shift left):邏輯左移

        LSR(logic shift right):邏輯右移

        ASR(arithmetic shift right):算術右移

        ROR(rotate shift right):循環右移

        RRX(rotate shift right with extend):帶擴展的循環右移。其中的C指的是CPSR的C位

        5、相對尋址

        相對尋址是基址尋址的一種變通。由程序計數器PC提供基準地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數的有效地址。例如:

        BLOOP
        ...
        LOOPMOVR6,#1

        該條B指令的意思是要跳轉到標號LOOP所代表的指令處,其含義相當明顯,但你要明白CPU根本不明白標號是個什么東西(事實上在指令的機器碼中根本就沒有標號這種東西),那么b loop這條指令的機器碼會是什么呢?答案是:高8bit是操作碼相關內容,低24bit是一個常數,表示從b指令到mov指令之間的內存地址的差值(如果不考慮流水線的影響的話)。由此可見,b loop這條指令相當于add pc, pc, #偏移量常數,典型的相對于PC(當前指令地址)的相對尋址。由于是相對于當前指令地址進行相對尋址,所以無論程序最終運行在內存的何處(即使運行的地址不是它預期的位置),這條B指令都能正確運行。關于相對尋址、程序期望的運行地址等等,我將在“ARM匯編偽指令”一文中詳細描述。

        隨便說一下,前面學到b指令的跳轉范圍是當前指令的先后32M,為什么是這個范圍呢?因為24bit常數用1個比特區別正負,還剩23bit,同時由于ARM指令在內存中的地址其最低2bit一定是0(為什么?請自行思考一下),因此23bit中可以不必表示這2個0,所以23bit可以表示的范圍是0 ---- 2^25,即:0 ---- 32M。

        我們在“基本尋址模式與基本指令”一文中學習了最常用的指令。下面介紹其它較為常用的指令。

        1、訪存指令

        LDRH(半字加載);LDRSH (有符號半字加載);STRH(半字存儲)

        交換指令

        助記符

        說明

        操作

        SWP Rd,Rm,[Rn]

        寄存器和存儲器字數據交換

        Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm)

        SWPB Rd,Rm,[Rn]

        寄存器和存儲器字節數據交換

        Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm)

        2、數據處理指令

        助記符

        說明

        操作

        MVN Rd,operand2

        數據非傳送

        Rd←(~operand2)

        助記符

        說明

        操作

        RSB Rd, Rn, operand2

        逆向減法指令

        Rd←operand2-Rn

        ADC Rd, Rn, operand2

        帶進位加法

        Rd←Rn+operand2+Carry

        SBC Rd, Rn, operand2

        帶進位減法指令

        Rd←Rn-operand2-(NOT)Carry

        RSC Rd, Rn, operand2

        帶進位逆向減法指令

        Rd←operand2-Rn-(NOT)Carry

        這里要特別提到,ADC指令結合CPSR,可以實現64位整數加法,詳情參見“雜項解釋”一文

        助記符

        說明

        操作

        BIC Rd, Rn, operand2

        按位清除指令

        Rd←Rn & (~operand2)

        其實現功能是:將Rn中對應于operand2中為1的bit位全部清0,然后將結果保存到Rd中

        助記符

        說明

        操作

        CMN Rn, operand2

        負數比較指令

        標志N、Z、C、V←Rn+operand2

        TST Rn, operand2

        位測試指令

        標志N、Z、C←Rn & operand2

        TEQ Rn, operand2

        相等測試指令

        標志N、Z、C←Rn ^ operand2

        TST指令測試的是:Rn中所有指定bit位是否全為0(指定的bit位是operand2中為1的所有位);

        TEQ指令測試的是:Rn和operand2是否相等。這點上與CMP指令一樣,區別在于CMP指令除了可以比較2個數是否相等外,也可以比較2個數誰大誰小,但TEQ不行。

        3、乘法指令

        助記符

        說明

        操作

        MUL Rd,Rm,Rs

        32位乘法指令

        Rd←Rm*Rs (Rd≠Rm)

        MLA Rd,Rm,Rs,Rn

        32位乘加指令

        Rd←Rm*Rs+Rn (Rd≠Rm)

        UMULL RdLo,RdHi,Rm,Rs

        64位無符號乘法指令

        (RdLo,RdHi) ←Rm*Rs

        UMLAL RdLo,RdHi,Rm,Rs

        64位無符號乘加指令

        (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)

        SMULL RdLo,RdHi,Rm,Rs

        64位有符號乘法指令

        (RdLo,RdHi) ←Rm*Rs

        SMLAL RdLo,RdHi,Rm,Rs

        64位有符號乘加指令

        (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)

        4、協處理器指令

        參見“MMU與內存保護的實現”一文

        5、雜項指令

        SWI:軟中斷指令,參見“swi與system call的實現”一文

        MRS、MSR:程序狀態寄存器操作指令,參見“ARM異常處理”一文


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丹凤县| 龙井市| 洛扎县| 延寿县| 白城市| 丽江市| 清丰县| 惠水县| 宝丰县| 孟村| 镶黄旗| 龙里县| 翁牛特旗| 宜章县| 灵丘县| 嘉定区| 武穴市| 济源市| 临沭县| 天台县| 平原县| 溧阳市| 东阿县| 淮北市| 肥东县| 竹北市| 尤溪县| 大丰市| 安顺市| 涿鹿县| 嘉禾县| 廊坊市| 洛阳市| 都匀市| 海兴县| 彰武县| 罗定市| 云阳县| 平凉市| 泾源县| 景泰县|