新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM指令中第二操作數為常數表達式時8位位圖的理解

        ARM指令中第二操作數為常數表達式時8位位圖的理解

        作者: 時間:2016-11-20 來源:網絡 收藏
        一條典型的ARM指令語法格式分為如下幾個部分:

        {} {S} ,{,}
        其中,<>內的項是必須的,{}內的項是可選的,如是指令助記符,是必須的,而{}為指令執行條件,是可選的,如果不寫則使用默認條件AL(無條件執行)。
        opcode指令助記符,如LDR,STR 等
        cond執行條件,如EQ,NE 等
        S是否影響CPSR 寄存器的值,書寫時影響CPSR,否則不影響
        Rd目標寄存器
        Rn第一個操作數的寄存器
        operand2第二個操作數

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

        其指令編碼格式如下:

        31-28

        27-25

        24-21

        20

        19-16

        15-12

        11-0 (12位)

        cond

        001

        opcode

        S

        Rn

        Rd

        operand2

        對其中的operand2的常數表達式有這樣的規定:“該常數必須對應8位位圖,即常熟是由一個8位的常熟循環右移偶數位得到的。”這句話的意思是說,當用12位第二操作數來表示一個32位立即數時,采用的是將8位數通過移位的方式來實現的,其中12位第二操作數的低八位存放被移位的“基本”數(取值范圍為0到255),而高四位存放的是循環右移的位數,因為位四位二進制數,所以取值范圍位為0到15,而對應的移位位數則為0到30位,也就是說若“移位”數為0,則表示“基本”數不變,若“移位”數位1,則表示將“基本”數在32位數字空間中循環右移2位,若“移位”數位5,則表示將“基本”數在32位數字空間中循環右移10位,若“移位”數位10,則表示將“基本”數在32位數字空間中循環右移20位,依次類推。舉例表示:
        ANDR1,R2,#0xff
        當處理器處理這條指令的第二操作數0xff時,因為0xff為8位二進制數,所以處理器就將其直接放進8位“基本”數中,而4位“移位”數則為0.
        ANDR1,R2,#0x104
        當處理器處理這條指令的第二操作數0x104時,因為此時0x104已經超過了8位二進制數,所以處理器就要將其“改造”一下,我們先把0x104轉換成二進制0000 0000 0000 0000 0000 0001 0000 0100,我們可以看到,這個數是0000 0000 0000 0000 0000 0000 0100 0001通過循環右移30位得到的,因此改造后的結果是8位“基本”數中存放0100 0001,而“移位”數為15。
        ANDR1,R2,#0xff000000
        當處理器處理這條指令的第二操作數0xff000000時,處理器同樣要對其“改造”,我們先把0xff000000轉換成二進制1111 1111 0000 0000 0000 0000 0000 0000,我們可以看到,這個數是0000 0000 0000 0000 0000 0000 1111 1111通過循環右移8位得到的,因此改造后的結果是8位“基本”數中存放1111 1111,而“移位”數為4。
        我想,通過以上的三個例子,就應該明白了8位位圖的原理了。但是,有些數并不符合8位位圖的原理,這樣的數在進行程序編譯時,系統將會提示出錯,下面再舉幾個違反8位位圖的例子:比如0x101,轉換成二進制后位0000 0000 0000 0000 0000 0001 0000 0001,像這個數,無論向右循環幾位,都無法將兩個1同時放到低8位中,因此不符合8位位圖;再比如0x102,轉換成二進制后位0000 0000 0000 0000 0000 0001 0000 0010,如果將兩個1同時放到低8位中,即轉換成二進制后為0000 0000 0000 0000 0000 0000 1000 0001,需要將此二進制數向右移31位,這也不符合循環右移偶數位的條件,因此0x012也不符合8位位圖;再舉一個0xff1,轉換成二進制后將會有9個1,不可能將其同時放入8位中,因此當然也不符合啦。
        通過正反例的比較,可以總結如下:第一,判斷一個數是否符合8位位圖的原則,首先看這個數轉換成二進制后1的個數是否不超過8個,如果不超過8個,再看這n個1(n<=8)是否能同時放到8個二進制位中,如果可以放進去,再看這八個二進制位是否可以循環右移偶數位得到起初被判斷的那個數值,如果可以,則此數值即為符合8位位圖原理,否則,不符合。第二,用12位的編碼來表示一個任意的32位數是不可能的,只能通過循環右移八位二進制數偶數位來得到一部分32位數,其余的無法表示的32位數,只有通過其它途徑獲得了,比如0xffffff00,可以通過0x000000ff按位取反得到,因此在以后的編程中,一定要注意用到的第二操作數是否符合8位位圖。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黄山市| 浪卡子县| 泸定县| 田阳县| 金昌市| 泾阳县| 山东省| 蓬安县| 西乌| 曲阜市| 广安市| 迭部县| 竹北市| 滦南县| 东港市| 大同市| 卢龙县| 西和县| 横山县| 杂多县| 崇州市| 汪清县| 富宁县| 通江县| 太原市| 金塔县| 上蔡县| 大同县| 开封市| 屏边| 福建省| 钟山县| 张家川| 公主岭市| 遵义市| 镇安县| 天气| 图们市| 濮阳市| 汝州市| 郁南县|