程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> KEIL的ARM編譯器對RW和ZI段的一個處理

KEIL的ARM編譯器對RW和ZI段的一個處理

編輯:關於C語言

按照C編譯器編譯的結果,一般會產生RO段,RW段,ZI段。RO是程序中的指令和常量,RW是程序中的已初始化全局變量,ZI是程序中的未初始化或初始化為零的全局變量。

那麼如下的代碼

int aaa;
int bbb;
    
int main()
{
    aaa = 7;
    bbb = 8;
    return 0;
}

應該產生的是八個字節的ZI段,但很奇怪,--bss_threshold=0

Program Size: Code=464 RO-data=268 RW-data=8 ZI-data=608

如上所示,其中的Code段,RO-data段和ZI-data段是啟動代碼產生的,這裡不深究。

它產生了8個字節的RW段,可以分析產生的map文件查看main匯編代碼和RW段,發現的確將aaa和bbb分配在了RW段。

map文件中的符號如下:

aaa      0x20000000   Data           4  main.o(.data)
bbb      0x20000004   Data           4  main.o(.data)
    
Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000268, Max: 0x00001000, ABSOLUTE)
    
Base Addr Size Type Attr Idx E Section Name Object
    
0x20000000 0x00000008 Data RW 11 .data main.o

想想沒道理,嘗試發現初始化了的全局變量也是放在RW段。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved