2009年9月29日 星期二

防止資料被初始化 in ARM environment

有的時候,資料並不想被初始化,這時候我們需要特別的指定section。在code裡面我們可以用
#pragma arm section zidata = "non_init"
int i, j;    //uninit (in non_init section)
#pragma arm section zidata   //back to default (.bss section)
int k=0, l=0;  //zero-init (in .bss section)
這樣我們就會有一個自己的section名子叫做non_init。之後在execution region中我們可以把它指定成UNINIT,好比說

LOAD_1 0x0{

EXEC_1 +0


{



* (+RO)


* (+RW)


* (+ZI) ;ZI data will be initialized to zero



}



EXEC_2 +0 UNINIT


{



* (non_init) ;ZI data will not be initialized to zero



}



}

這樣我們的i和j就不會就算不給值也不會被初始成0了。

ARM assembly 範例 and 解說

   AREA ARMex, CODE, READONLY ;Name this block of code ARMex
   ENTRY ;Mark first instruction to execute
start
   MOV r0, #10 ; Set up parameters
   MOV r1, #3
   ADD r0, r0, r1 ; r0 = r0 + r1
stop
   MOV r0, #0x18 ; angel_SWIreason_ReportException
   LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
   SVC #0x123456 ; ARM semihosting (formerly SWI)
END ; Mark end of file

我們可以發現第一行就指定了這個section的名子,叫做ARMex。第一個AREA的意思是表示一個section
的開始,除了明子以外,還會設定這個section的屬性。名子基本上可以隨便取,可是如果不是英文字母開頭的話,就要用兩個bar把它包起來,好比說|1_DataArea|。不然的話會有AREA name missing的錯誤。


ENTRY跟AREA一樣,都是directive,顧名思義是說明一個section的開始,後面的END相對應的就是說明一個section的結束。

start和stop都是function的label。

如果是在C code裡面的話
就是 #pragma arm section [code、rwdata、rodata、zidata] = "label"

ARM assembler online reference

you can find a quick reference online through the following link

http://www.keil.com/support/man/docs/armasm/