<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 對(duì)ARM數(shù)據(jù)處理指令中#immed_8r的理解

          對(duì)ARM數(shù)據(jù)處理指令中#immed_8r的理解

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

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

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


          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();