A function declared with __callt is called by the callt instruction.
[Function]
- | A function declared with __callt (callt function) is called by the callt instruction.
The callt instruction enables a function whose "start address of function definition" is stored in the area (0x80 to 0xBF) called as the callt instruction table to be called by a shorter code than a direct function call. |
- | The callt function is called by the callt instruction using a label name with @_ added to the beginning of the function name.
When the callt function is called at the end of a function, the callt instruction is not used to make the call in some cases. |
- | The called function is handled as a normal function in the C source program. |
- | The specification becomes __near, and address reference always returns a near pointer. |
- | The callt function is allocated to a section with the relocation attribute TEXT. |
- | The callt instruction table is allocated to the .callt0 section. |
[Effect]
- | The size of the object code becomes smaller because the function is called by a 2-byte call instruction. |
[Usage]
- | The __callt declaration is made in the module that defines the function. |
__callt function-declaration;
extern __callt function-declaration;
static __callt function-declaration;
__callt extern function-declaration;
__callt static function-declaration;
|
[Restrictions]
- | The callt function is allocated to addresses 0xC0 to 0xFFFF regardless of the memory model. |
- | When __callt is specified for other than a function declaration, a compilation error will occur. |
- | The number of callt functions is checked at linkage. |
- | __callt needs to be specified for all declarations of the target function.
When there is a __callt specification for only some declarations, a compilation error will occur. |
void func(void);
__callt void func(void); //Error
|
- | __callt can be specified simultaneously with __near but a compilation error will occur when it is specified simultaneously with __far. |
__callt void func1(void); //Function address is set to near
__callt __near void func2(void); //Function address is set to near
__callt __far void func3(void); //Error
|
- | When __callt is used in typedef, a compilation error will occur. |
typedef __callt int CI; //Error
|
- | When there is a #pragma specification for a function that is qualified with __callt in the function declaration, a compilation error will occur. |
[Example]
The following shows a sample C source code.
__callt void func(void){
:
}
void main(void){
func(); //Call of callt function
:
}
|
The following shows the section allocation and output codes in the assembly source code.
.PUBLIC _func
.PUBLIC _main
.PUBLIC @_func
:
.SECTION .text,TEXT
_func:
:
.SECTION .textf,TEXTF
_main:
callt [@_func]
:
.SECTION .callt0,CALLT0
@_func:
.DB2 _func
:
|
[Remark]
- | Difference between the __callt keyword and #pragma callt |
- | The __callt keyword cannot be used together with the __far keyword, and a compilation error will occur if used so. |
- | #pragma callt handles even a function to which the __far keyword is added as if __callt was specified without a warning being output. |