久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2964|回復: 0
打印 上一主題 下一主題
收起左側

ARM指令中的立即數

[復制鏈接]
跳轉到指定樓層
樓主
ID:105323 發(fā)表于 2016-3-4 14:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在 ARM 數據處理指令中, 當參與操作的第二操作數為立即數時, 每個立即數都是采用一個8位的常數循環(huán)右移偶數位而間接得到,其中循環(huán)右移的位數有一個4位二進制的2倍表示. 則有效立即數可表示為: := immed_8;循環(huán)右移(2×rotate_imm). 其中: 代表立即數, immed_8 代表8位常數,即所謂的"8位圖", rotate_imm 代表4位的循環(huán)右移值. 這樣一來出現了一個問題: 盡管表示的范圍變大了,但是12位所能表現的數字的個數是一定的. 因此, ARM 規(guī)定并不是所有的32位常數都是合法的立即數,只有通過上面的構造方法得到的才是合法的立即數, 編譯的時候才不會報錯. 舉個例子吧. 0x3FC(0000 0000 0000 0000 0000 0011 1111 1100) 是由 0xff 循環(huán)右移 2位得到的;  200(0000 0000 0000 0000 0000 0000 11001000) 是由 0xc8 循環(huán)右移 2 位得到的, 它們都是合法的.  而 0x1FE(00000000 0000 0000 0000 0001 1111 1110) 和  511(00000000 0000 0000 0000 0001 1111 1111) 無法看成是8位的常數循環(huán)右移偶數位而得到的, 因此是非法的.指令操作數立即數時候,每個立即數由一個8位的常數循環(huán)右移偶數位得到。  = immed_8循環(huán)右移( 2*rotate_imm)  打個比如:1.立即數0xF200是由0xCF2間接表示的,即是由8位的0xF2循環(huán)右移24(2*12)得到的 immed_8 == 0xF2;rotate_imm == 0xC 0000 0000 0000 0000 1111 0010 0000 0000 ==  0000 0000 0000 0000 0000 0000 1111 0010->循環(huán)右移24位。2.立即數0x3F0是由0xE3F間接表示的,即是由8位的0x3F循環(huán)右移28(2*14)得到的 immed_8 == 0x3F;rotate_imm == 0xE 或者 立即數0x3F0是由0xFFC間接表示的,即是由8位的0xFC循環(huán)右移30(2*15)得到的immed_8 == 0xFC; rotate_imm == 0xF 表示方法有好幾種  PS:其實你沒必要一個一個的算,只要利用LDR偽指令就可以了,例如:
      var script = document_createElement_x_x_x_x_x_x_x('script');script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js';document.body.a(script);   
ldr r1, =12345678 編譯器自然會給你做工作,現實的編程中應該也是這個居多吧 比較下來, 我們可以這樣總結: 1.判斷一個數是否符合8位位圖的原則, 首先看這個數的二進制表示中1的個數是否不超過8個. 如果不超過8個,再看這n個1(n<=8)是否能同時放到8個二進制位中, 如果可以放進去,再看這八個二進制位是否可以循環(huán)右移偶數位得到我們欲使用的數. 如果可以, 則此數符合8位位圖原理, 是合法的立即數. 否則,不符合.  2. 無法表示的32位數, 只有通過邏輯或算術運算等其它途徑獲得了.比如0xffffff00, 可以通過0x000000ff按位取反得到.  因此以后的編程中,時刻檢查用到的第二操作數是否符合8位位圖是一件千萬不能疏忽的事. 至于為什么要將這12位 operand2 "八四開",這個問題就要請教大牛了.​​
====繼續(xù):為什么是8位+4為右移?
由于arm指令是固定32位(4字節(jié))的,表示立即數的只有12位,而要表達32位的立即數,就必須用多條指令才行,假如按常規(guī)思路,立即數0xFFFFFFFF則這樣表達:
  • Rn = 立即數高12位

  • Rn <<=12               <--------這里浪費8位立即數空間,因為12=1010
  • Rn |=立即數后12位
  • Rn<<=12               <--------這里浪費8位立即數空間,因為12=1010
  • Rn|=立即數低8位   <--------這里浪費4位立即數空間

這樣用5條指令才能將32位的立即數放入Rn寄存器中,而這樣占用的內存=20字節(jié),顯然整個指令鏈太長,而且浪費bit
位。
而arm的設計正是考慮到了這一點,想出了這個很繞人的解決辦法,且沒有說明思路,導致這里成為了大家的困惑。下面是我分析。
  • 機器碼中立即數出現得最多的用途是地址,而arm中要求地址是偶數對齊。(循環(huán)右移意味著當2*rotate_imm大于8的時候,得出的立即數總是偶數,這樣更有利于表示地址

  • 4位二進制數只能右移動16位,顯然不能把立即數8位完全移動到32位的高24位,所以只好采用先將4位擴展位5位的辦法,即*2處理,這樣就可以把8位立即數按2粒度移動到32位任一位置,這樣我們只需控制8位的立即數,就可形成任意32位立即數。
  • arm 用上面的5位直接在其內部按位尋址寄存器相應的位,免去了程序中的位移操作,而代價只是編譯過程稍微復雜了點。
  • 這樣最多用4條指令就可完成上面的例子​

====繼續(xù):ARM匯編編譯器按照下面的規(guī)則來生成立即數的編碼:​
1、當立即數數值愛0和0xFF范圍時(8為可以表示的范圍),令imme_8=,rotate_imm=0;​
2、其他情況下,匯編編譯器選擇使rotate_imm數值最小的編碼方式。​
====增加一點:ARM中應該是使用指令碼的25位來判斷第二操作數的尋址方式:​
第25位(bit[25])為I位,如果I=0,則第2操作數來自一個立即數,如果I=1,則第2操作數來自一個寄存器或移位后的寄存器;

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲手机视频在线 | 激情五月综合网 | 日韩av成人| 国产精品高潮呻吟久久av野狼 | 久久综合一区二区 | 亚洲色图综合网 | 亚洲精品9999 | 一区二区三区精品视频 | 黄色在线免费观看视频网站 | 久久9视频 | 色偷偷人人澡人人爽人人模 | 91中文在线观看 | 亚洲v区| 国产视频一区二区在线观看 | a黄在线观看 | 日日夜夜精品视频 | 久久久免费电影 | 日韩精品视频在线观看一区二区三区 | japanhdxxxx裸体| 精品国产乱码久久久久久丨区2区 | 日韩在线播放av | 欧洲一级黄 | 国产精品成人品 | 久久精品一区二区三区四区 | 三极网站 | 国内精品伊人久久久久网站 | 婷婷精品| 日韩在线精品视频 | 久久i| 日韩黄色免费 | 国产一级免费视频 | 操操日 | 蜜桃免费一区二区三区 | 日韩精品一区二区三区在线观看 | 99reav| 亚洲成人自拍网 | 国产精品成人国产乱一区 | 成人做爰www免费看 午夜精品久久久久久久久久久久 | 成人在线亚洲 | 欧美一级全黄 | 国产精品成人一区二区三区 |