新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 對ARM數據處理指令中#immed_8r的理解

        對ARM數據處理指令中#immed_8r的理解

        作者: 時間:2016-11-28 來源:網絡 收藏
        首先要感謝tekkamanninja所作博文http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94265&page=1#comment《關于ARM處理器中“8位位圖”的理解分析》(閱讀次數達到8000,壯觀,敬仰),為我對這個問題的思考帶來檸檬水滴入眼球一般的暢爽!
        見書中有如下描述“大多數ARM通用數據處理指令有一個靈活的第二操作數(flexible second operand)。”其中的#immed_8r的第二操作數形式讓我百思不得其解。查到ZLG的課件(感謝)有如下圖表:

        #immed_8r這個立即數的要求是滿足如上8位位圖,即兩點要求:
        1·能用長度為8位的框框將這個數框起來。
        錯誤示范:先假設#immed_8r值為0x101(00000000 00000000 00000001 00000001)紅色加粗部分為9位,無法滿足此要求,編譯會出錯。
        2·這個數必須能由一個8位的常數循環右移偶數次得到。
        錯誤示范:設#immed_8r值為0x102(00000000 00000000 00000001 00000010)假如把紅色加粗部分看做8位常數框(滿足要求1)。可以看出,這是經過奇數次循環右移得到的結果,不滿足要求2。
        0x102(00000000 00000000 00000001 00000010)假如試圖滿足要求2,以紅色加粗部分看做是由原常數循環右移0次(0、2、4、……、30都是偶數次,后面將解釋)得到,則會不滿足要求1(9位)。所以編譯也會報錯。
        上面的要求使得#immed_8r不能直接取遍32位所有數(是不是ARM的所有立即數都有這個要求嗎?對寄存器的立即數操作呢?后來(11.11.16)學習到:偽指令LDR{cond} register,=[expr | label-expr]貌似能夠存入任意32位數,但是具體限制又是什么呢?),為什么不能一步到位,下面根據參考的博文來分析:
        ARM的數據處理指令語法通常為(以AND、ORR、EOR、BIC為例):op {cond}{S} Rd,Rn{,Operand2}
        但其實它的ARM的指令編碼如下:

        其中[7:0]位就是要求8位的原因,留給立即數數值的位數只有8位。
        而[11:8]位rotate是循環(右移)次數,是4位的。
        我設想可能設計者是這樣考慮的:就算12個位全部用來存立即數,也只能表示2^12次個數,和2^32次個數相差很遠。于是使用循環(右移)次數標記來與8位立即數組合。
        但假如每+1,只右移1位的話,全部加滿也才右移了2^4=16位(0~15)。所以設定每+1標記,循環右移2位,這樣就能移遍32位(0~15 X 2)。
        即便是這樣,也不能表示完2^32個值,就如同上面的錯誤示范的數是不符合要求的。這就有了bootload中這樣的語句(我復制的是6410的,書是ARM7的,看來學這點一直沒變):
        bic r1, r1, #0xff00
        bic r1, r1, #0xff
        組合起來,才能表示#0xffff(指令還沒學完……只能說到這里)
        ARM門檻高,知識點多而且細……大家繼續努力吧~!


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 楚雄市| 元朗区| 临汾市| 保山市| 柞水县| 东台市| 缙云县| 柳江县| 财经| 平潭县| 平乐县| 宁南县| 榆林市| 应用必备| 松溪县| 凌海市| 汕头市| 宁陵县| 曲麻莱县| 石嘴山市| 阿瓦提县| 城固县| 郴州市| 如东县| 涞水县| 雷山县| 仙游县| 民丰县| 醴陵市| 兴隆县| 盈江县| 西丰县| 甘洛县| 新沂市| 泌阳县| 化州市| 永胜县| 沐川县| 昭苏县| 定州市| 保亭|