Microsoft ARM汇编器的部分Directives参考

作者:陆麟
转载请征得作者同意.
2003.5.16



下面列出的是MS ARM汇编器的数据初始化部分的directive. 版权是MS的. 翻译是我干的. 方便一下参考.

Directive    Syntax                        Description
DCB          label DCB expression-list     定义1个或多个字节,在THUNB代码中使用则需要DATA directive. 相当于 = directive.
        
=            label = expression-list       相当于DCB
        
DCD          label DCD expression-list     定义1个或多个字, 相当于 & directive.
        
&            label & expression-list       相当于DCD
        
DCDO         label DCDO expression-list    定义1个或多个字, 4字节对齐. 作为从sb(r9)的偏移.
        
DCDU         label DCDU expression-list    定义1个或多个字, 不对齐. 在代码段中使用时需要用ALIGN来对齐下一代码行.
        
DCFD         {label} DCFD fp-constant{     定义DOUBOULE类型的浮点数. 第一个数分配时4字节对齐.
                ,fp-constant}

DCFDU        {label} DCFD fp-constant{     定义DOUBOULE类型的浮点数. 不对齐.
                ,fp-constant}    

DCFS         {label} DCFS fp-constant{     定义单精度类型的浮点数. 第一个数分配时4字节对齐.
                ,fp-constant}    
DCFSU        {label} DCFS fp-constant{     定义单精度类型的浮点数. 不对齐.
                ,fp-constant}
   
DCI          label DCI expression-list     在ARM代码中, 定义1个或者更多的字. 4字节对齐. 在THUNB代码中,定义1个或更多的半字.
        
DCW          label DCW expression-list     定义1个或多个半字.
        
DCWU         label DCW expression-list     定义1个或者多个半字. 不对齐. 在代码中使用注意:在后面的代码前加ALIGN. 确保对齐.
        
FIELD        label FIELD expression        保留存储空间. 每次使用, 保留的空间就增大expression指定的值. 此directive需要搭配MAP directive使用.
        
#            label  # expression           同FIELD directive
        
MAP          MAP expression{,base-register}    在expression指定地方设定一片区域的存储MAP.同^ directive
        
^            ^ expression{,base-register}  同MAP directive.
        
SPACE        label SPACE numeric-expression    保留空间numberic-expression指定大小的空间. 以0初始化.同 % directive.
        
%            label % numeric-expression    同 SPACE directive.
        
关于MAP,FIELD,SPACE的实例:(实例来源于WINDOWS CE OS ARM初始化部分源代码)

        ^ 0xFFFD0000
FirstPT         # 0x4000
PageTables      # 0x4000
                # 0x8000
                # 0x10000       ; not mapped
ExVector        # 0x1000
                # 0x1400        ; not mapped
                # 0x0400        ; 1K interrupt stack
IntStack        # 0x2000        ; not mapped                    (ffff2800)
                # 0x0100        ; not mapped (FIQ stack)        (ffff4800)
                # 0x0700        ; 2K-256 abort stack            (ffff4900)
AbortStack      # 0x1800        ; not mapped                    (ffff5000)
                # 0x0100        ; not mapped (FIQ stack)        (ffff6800)
FIQStack        # 0xC000-0x6900 ; not mapped                    (ffff6900)
KDBase          # 0x07E0        ; 2K-32 kernel stack
KStack          # 0x0020        ; temporary register save area
KData           # 0x400         ; kernel data area


        ;-----------------------------------------------------------------------
        ; .KDATA area is used to reserve physical memory for the above structures.
        AREA |.KDATA|,DATA,NOINIT
       
        EXPORT  ExceptionVectors
       
KDataArea
PTs     %       0x4000          ; space for first-level page table
        %       0x4000          ; space for 2nd-level page tables
ExceptionVectors
        %       0x0400          ; space for exception vectors
        %       0x0400          ; space for interrupt stack
        %       0x0100          ; space for FIQ stack
        %       0x0700          ; space for Abort stack
KPage   %       0x0c00          ; space for kernel stack & KDataStruct
HighPT  %       0x0400          ; space for 2nd level page table to map 0xFFF00000
KDEnd   %       0