Using saddr area (__saddr)
|
When declared with __saddr, external variables and static variables in a function are allocated to the saddr area.
[Function]
- | Initialized variables are allocated to the .sdata section. |
- | Uninitialized variables are allocated to the .sbss section. |
- | Address reference always returns a near pointer. |
- | External variables and static variables in a function are allocated to the saddr area when they are declared with __saddr. |
- | These variables are handled in the same way as other variables in a C source file. |
[Effect]
- | Instructions that access the saddr area are shorter than those accessing the normal memory area and their object code also becomes smaller, leading to improved execution speed. |
[Usage]
- | Declare __saddr in the module or function that defines variables.
In a function, only variables with the extern or static storage class specifier can be declared with __saddr. |
__saddr variable-declaration;
extern __saddr variable-declaration;
static __saddr variable-declaration;
__saddr extern variable-declaration;
__saddr static variable-declaration;
|
[Restrictions]
- | If __saddr is specified for a const type variable, a compilation error will occur. |
- | If __saddr is specified for a function, a compilation error will occur. |
- | If __saddr is used for a purpose other than variable with static storage duration, a compilation error will occur. |
- | If __saddr and __near or __far are specified together, a compilation error will occur. |
__saddr __near int ni; //Error
__saddr __far int fi; //Error
|
- | If __saddr is used in a typedef declaration, a compilation error will occur. |
typedef __saddr int SI; //Error
|
[Example]
The following shows a sample C source code.
__saddr int hsmm0; //.sbss
__saddr int hsmm1=1; //.sdata
__saddr int *hsptr; //hsptr is allocated to. sbss
//The pointed location is in a normal area.
void main(){
hsmm0 -= hsmm1;
hsptr = 0;
}
|
The following shows the declarations and section allocation in the assembly source code.
.PUBLIC _hsmm0 ;Declaration
.PUBLIC _hsmm1 ;Declaration
.PUBLIC _hsptr ;Declaration
.SECTION .sbss,SBSS ;Allocated to the .sbss section
.ALIGN 2
_hsmm0:
.DS 2
.ALIGN 2
_hsptr:
.DS 2
.SECTION .sdata,SDATA ;Allocated to the .sdata section
.ALIGN 2
_hsmm1:
.DB2 0x0001
|
The following shows the code in the function.
movw ax, _hsmm0
subw ax, _hsmm1
movw _hsmm0, ax
movw _hsptr, #0x0000
|
[Remark]
- | Difference between the __saddr keyword and #pragma saddr |
- | The __saddr keyword cannot be used together with the __near or __far keyword, and a compilation error will occur if used so. |
- | #pragma saddr handles even a variable to which the __near or __far keyword is added as if __saddr was specified without a warning being output. |