<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 深入分析S3C2440啟動(dòng)代碼中大小端問(wèn)題

深入分析S3C2440啟動(dòng)代碼中大小端問(wèn)題

作者: 時(shí)間:2016-11-22 來(lái)源:網(wǎng)絡(luò ) 收藏

一、ADS1.2中關(guān)于大小端的設置以及對編譯后的代碼的影響

下面是一段代碼在線(xiàn)段模式下編譯,生成的二進(jìn)制文件的內容
大端模式下編譯,生成二進(jìn)制文件的內容
根據上面的內容可以看出:它們的字節序是相反的,也就是說(shuō),ADS1.2中對大小端的設置會(huì )影響最終生成的二進(jìn)制文件的字節序。

二、S3C2440啟動(dòng)代碼中與大小管相關(guān)的代碼

Option.inc中相關(guān)代碼

本文引用地址:http://dyxdggzs.com/article/201611/319967.htm
[plain]view plaincopy
print?
  1. GBLLENDIAN_CHANGE
  2. NDIAN_CHANGESETL{FALSE}
  3. GBLAENTRY_BUS_WIDTH
  4. NTRY_BUS_WIDTHSETA16


2440init.s中相關(guān)代碼
[plain]view plaincopy
print?
  1. AREAInit,CODE,READONLY
  2. ENTRY
  3. EXPORT__ENTRY
  4. __ENTRY
  5. ResetEntry
  6. ;1)Thecode,whichconvertstoBig-endian,shouldbeinlittleendiancode.
  7. ;2)ThefollowinglittleendiancodewillbecompiledinBig-Endianmode.
  8. ;Thecodebyteordershouldbechangedasthememorybuswidth.
  9. ;3)Thepseudoinstruction,DCDcannotbeusedherebecausethelinkergenerateserror.
  10. ASSERT:DEF:ENDIAN_CHANGE
  11. [ENDIAN_CHANGE
  12. ASSERT:DEF:ENTRY_BUS_WIDTH
  13. [ENTRY_BUS_WIDTH=32
  14. bChangeBigEndian;DCD0xea000007
  15. ]
  16. [ENTRY_BUS_WIDTH=16
  17. andeqr14,r7,r0,lsl#20;DCD0x0007ea00
  18. ]
  19. [ENTRY_BUS_WIDTH=8
  20. streqr0,[r0,-r10,ror#1];DCD0x070000ea
  21. ]
  22. |
  23. bResetHandler
  24. ]
  25. bHandlerUndef;handlerforUndefinedmode
  26. bHandlerSWI;handlerforSWIinterrupt
  27. bHandlerPabort;handlerforPAbort
  28. bHandlerDabort;handlerforDAbort
  29. b.;reserved
  30. bHandlerIRQ;handlerforIRQinterrupt
  31. bHandlerFIQ;handlerforFIQinterrupt
  32. ;@0x20
  33. bEnterPWDN;Mustbe@0x20.
  34. ChangeBigEndian
  35. ;@0x24
  36. [ENTRY_BUS_WIDTH=32
  37. DCD0xee110f10;0xee110f10=>mrcp15,0,r0,c1,c0,0
  38. DCD0xe3800080;0xe3800080=>orrr0,r0,#0x80;//Big-endian
  39. DCD0xee010f10;0xee010f10=>mcrp15,0,r0,c1,c0,0
  40. ]
  41. [ENTRY_BUS_WIDTH=16
  42. DCD0x0f10ee11
  43. DCD0x0080e380
  44. DCD0x0f10ee01
  45. ]
  46. [ENTRY_BUS_WIDTH=8
  47. DCD0x100f11ee
  48. DCD0x800080e3
  49. DCD0x100f01ee
  50. ]
  51. DCD0xffffffff;swinv0xffffffissimilarwithNOPandrunwellinbothendianmode.
  52. DCD0xffffffff
  53. DCD0xffffffff
  54. DCD0xffffffff
  55. DCD0xffffffff
  56. bResetHandler
我們可以看到,在Option.inc將ENDIAN_CHANGE設置FALSE,程序將直接運行b ResetHandler,S3C2440默認是處于小端模式,ADS1.2中的設置默認也是小段模式,一切風(fēng)平浪靜。
現在,我們在A(yíng)DS1.2中設為打斷模式,并把ENDIAN_CHANGE設置FALSE設為T(mén)URE,現在問(wèn)題就來(lái)了,請看下面的分析。
在編譯程序時(shí),根據ENTRY_BUS_WIDTH宏會(huì )將下面三條指令的之一放在0地址處
b ChangeBigEndian ;DCD 0xea000007
andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00
streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
其實(shí)這三條指令的功能都是一樣,只是根據數據帶寬調整了字節序,都是跳轉到0x24處的ChangeBigEndian執行,ChangeBigEndian的作用就是通過(guò)協(xié)處理CP15中的寄存器C1來(lái)改變S3C2440的大小端模式。
先來(lái)看一下這三條指令。因為我們已經(jīng)在A(yíng)DS中設置為大端模式,所以這些指令是以大端模式進(jìn)行編譯的,而S3C2440此時(shí)還是小端模式,S3C2440怎么能執行大端模式下的指令呢,比如b ChangeBigEndian ;DCD 0xea000007???
原因如下:
如果一個(gè)基于 ARM 芯片將存儲器系統配置為其中一種存儲器格式(如小端) ,而實(shí)際連接的存儲器系統配置為相反的格式(如大端) ,那么只有以字為單位的指令取指、數據裝載和數據保存能夠可靠實(shí)現。其它的存儲器訪(fǎng)問(wèn)將出現不可預期的結果。也就就是說(shuō)在32位模式下,大小端模式對指令取指、數據裝載和數據保存沒(méi)有影響。(注意:如果實(shí)際的存儲器格式與芯片的存儲器格式不符時(shí),只有以字為單位的數據存取才正確,否則將出現不可預期的結果。)
b ChangeBigEndian在大端模式下機器碼是0xea000007,這是32位模式下,其四個(gè)字節從低到高分別是:07 00 00 ea。那沒(méi)b ChangeBigEndian這條指令在8位模式下,要被小端模式的S3C2440執行,就要人為的修改為0x070000ea。在存儲器中存儲的順序:從低地址到高地址分別是 07 00 00 ea,S3C2440按小端模式取指令時(shí),取得是0xea000007。
b ChangeBigEndian這條指令在16位模式下,要被小端模式的S3C2440執行,就要人為的修改為0x0007ea00。在存儲器中存儲的順序:從低地址到高地址分別是 0007 ea00,S3C2440按小端模式取指令時(shí),取得是0xea000007。
后面修改協(xié)處理CP15中的寄存器C1的代碼時(shí)類(lèi)似的。


評論


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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>