1. 程式人生 > >GNU彙編中.word偽指令的理解

GNU彙編中.word偽指令的理解

在u-boot中遇到_armboot_start、_bss_start等這些變數,這些偽指令的用法涉及以下知識1.彙編是“絕對引用”,即引用的就是地址在start.s中_TEXT_BASE: .word TEXT_BASE /*uboot映像在SDRAM中的重定位地址,我設定為0x33e00000 */ .globl _armboot_start _armboot_start: .word _start /*_start是程式入口,連結完 畢它的值是0x33e00000 =TEXT_BASE*/ 
  1. arm-linux-objdump -D u-boot > u-boot.s
在u-boot.s中找到以下語句
  1. 33e00000 <_start>:
  2. 33e00000: ea000013 b 33e00054
_start的值是33e00000,這個地址上儲存的指令是b reset
  1. _armboot_start:
  2. .word _start
對應反彙編結果
  1. 33e00048 <_armboot_start>:
  2. 46 33e00048: 33e00000 .word 0x33e00000
  3. 47
這句話的意思是在_armboot_start標號處,儲存了_start的值,也就是說,_armboot_start是存放_start的地址, 即_armboot_start對應的儲存單元本身地址是0x33e00048,內容是0x33e00000
  1. ldr r1, _armboot_start
  2. ldr r2, _start
r1是33e00048,r2是0x33e00000---彙編中對標號的引用,是絕對引用,就是標號的地址本身
  1. .globl _bss_start
  2. _bss_start:

  3. .word __bss_start
按照上面的理解,__bss_start是uboot 的bss段起始地址,那麼u-boot映像的大小就是__bss_start - _start;在relocate程式碼段中計算u-boot的大小時,也體現了這一點。 2.C語言對變數/符號/常量的引用必須通過地址間接定址,即引用的是標號的內容,而非標號本身地址。
  1. monitor_flash_len = _bss_start - _armboot_start
這句話中對_armboot_star的引用,實際上是把它用作了指標值,即0x33e00000,monitor_flash_len就得到u-boot的長度(包括程式碼段,資料段)簡單的可理解為_armboot_start---C語言中引用的值是0x33e00000_armboot_start---彙編中引用得到的值是b reset <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(1414) | 評論(0) | 轉發(1) | 給主人留下些什麼吧!~~ 評論熱議