## Address allocation

The address of each global entity is determined during final assembly and depends on link process, so you cannot make any assumption about regular variable/function locations.

However, each entity can be manually placed at any address, using the `@` extension. For example:

    int x@0x12 ;  // manually located definition
    extern unsigned char STATUS@0xFD8 ; // manually located declaration

This feature is very handy to access Special Function Registers. `cpik` provides a set of header files containing the declaration of each SFR register, for each processor. These headers are automatically generated by a program that takes the informations from Microchip's «`.inc`» files. For example, here is the beginning of the `p18f2525.h` header file:

    #ifndef DEVICE
    #define DEVICE p18f2525
    #define p18f2525

    // ======================================
    //         PROCESSOR : p18f2525
    // ======================================

    // This file has been automatically generated from Microchip's "p18f2525.inc" file.
    // with the inc2h-v2 utility.             Please do not edit by hand.
    // Do not use with cpik versions prior V0.7, report problems to author.
    // (C) Alain Gibaud  2012    (alain.gibaud@free.fr)

    #pragma firstsfr 0xf80
    // ------------------------------
    //        PORTA
    // ------------------------------
    unsigned int PORTA@0xf80 ;
    union
    {

    struct
    {
      unsigned int
      RA0 : 1 ,
      RA1 : 1 ,
      RA2 : 1 ,
      RA3 : 1 ,
      RA4 : 1 ,
      RA5 : 1 ,
      RA6 : 1 ,
      RA7 : 1 ;
    } ;

    struct
    {
      unsigned int
      : 4,
      T0CKI : 1 ,
      AN4 : 1 ;
    } ;

    struct
    {
      unsigned int
      : 5,
      SS : 1 ;
    } ;

    struct
    {
      unsigned int
      : 5,
      NOT_SS : 1 ;
    } ;

    struct
    {
      unsigned int
      : 5,
      LVDIN : 1 ;
    } ;

    struct
    {
      unsigned int
      : 5,
      HLVDIN : 1 ;
    } ;

    } PORTAbits@0xf80  ;
    ...