新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 淺述ARM匯編的立即數

        淺述ARM匯編的立即數

        作者: 時間:2016-11-09 來源:網絡 收藏
        大多數的數據處理指令和部分狀態寄存器訪問指令用到立即數,在ARM中不是所有數都能用作立即數;

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

        一條典型的ARM匯編語法格式:

        {cond}{S} ,,

        其中 opcode: 指令助記符,如ADD、SUB、MOV等;
        cond: 條件碼助記符,如EQ(0000)、NE(0001)、AL(1110)等;
        S:如果指令有S后綴,則該指令的操作會影響CPSR的值;
        Rd:目標寄存器;
        Rn: 包含第一個源操作數的寄存器;
        shifter_operand: 表示第二個源操作數,可以為立即數。

        一條典型的ARM匯編編碼格式:

        操作數的語法格式:
        #
        其中,=immed_8循環右移(2*rotate_imm)

        immediate: 立即數
        immed_8 : 8位的常數
        rotate_imm: 4位的循環右移值

        意思是每個立即數都是由一個8位的常循環右移偶數位得到。

        ROR 循環右移:即將操作數循環按指定的數量向右循環移位,左邊用右邊移出的位來填充;

        例如:有效的立即數:0x104、0xff0
        immediate : 0x104// 0001 0000 0100
        immed_8 : 0x81// 0100 0001
        左邊補0: 0x00000081// 0000 0000 0000 0000 0000 0000 1000 0001
        rotate_imm: 15 // 循環右移(2*15)位
        // 0000 0000 0000 0000 0000 0001 0000 0100
        // 0x0000 0104

        immediate : 0xff0 // 1111 1111 0000
        immed_8: 0xff// 1111 1111
        左邊補0: 0x000000ff// 0000 0000 0000 0000 0000 0000 1111 1111
        rotate_imm: 14// 循環右移(2*14)位
        // 0000 0000 0000 0000 0000 1111 1111 0000
        // 0x0000 0ff0

        無效的立即數不能通過上面的構造方法得到:0x101、0x102、0xff1
        0x101:0001 0000 0001(不能通過一個八位常數獲得)
        0x102: 0001 0000 0010(不能通過移動偶數位獲得)
        0xff1: 1111 1111 0001

        但是有時候用出現這種情況,如:0x3f0
        可以為:#0x3f,ror (2*14)
        或: #0xfc,ror (2*15)

        面對這種情況,ARM有如下規則:
        1. 當立即數的值0-0xFF時,immed_8=,rotate_imm=0;
        2. 其它情況下,匯編編譯器選擇使rotate_imm的數值最小的編碼方式.

        所以0x3f0 是通過 0x3f>>(2*14) 的方式獲得。

        LDR偽指令: 裝入32位立即數或地址到寄存器

        語法: LDR{} ,=[|label-expr]

        expr表示32位常數

        eg:

        ldr r3,=0xFFF
        ldr r1, =12345678



        關鍵詞: ARM匯編立即

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 马关县| 天柱县| 浦县| 闵行区| 星子县| 彩票| 太康县| 巍山| 北票市| 盐池县| 昌图县| 招远市| 中卫市| 普兰县| 饶平县| 蒙山县| 长乐市| 临清市| 建阳市| 教育| 宣恩县| 孟州市| 济源市| 泽普县| 神农架林区| 嘉兴市| 高碑店市| 肥城市| 长治市| 九江县| 县级市| 宁都县| 宣威市| 宁陕县| 临澧县| 达拉特旗| 观塘区| 璧山县| 龙陵县| 兴海县| 高陵县|