Skip Navigation Links | |
Exit Print View | |
SPARC Assembly Language Reference Manual Oracle Solaris 11.1 Information Library |
2. Executable and Linking Format
3. Directives and Pseudo-Operations
6. Writing Functions -- The SPARC ABI
6.4 Functions Returning Values
6.4.1 Limitations for 32-Bit Code
6.4.2 Limitations for Both 32-Bit and 64-Bit Code
7. Assembler Inline Functions and __asm Code
A. Using the Assembler Command Line
A good place to start is with a simple C function:
int add(int a, int b) { return a + b; }
Compiling with the C compiler's –S option generates the assembler code:
demo% cc -O add.c -S demo% cat add.s ! --------BEGIN PROLOG ------------ .section ".text",#alloc,#execinstr,#progbits .file "add.c" .section ".bss",#alloc,#write,#nobits Bbss.bss: .section ".data",#alloc,#write,#progbits Ddata.data: .section ".rodata",#alloc,#progbits ! ! CONSTANT POOL ! Drodata.rodata: .section ".text",#alloc,#execinstr,#progbits /* 000000 0 */ .align 4 /* 000000 */ .skip 16 /* 0x0010 */ .align 4 ! FILE add.c ! 1 !int add(int a, int b) ! 2 !{ ! ! SUBROUTINE add ! ! OFFSET SOURCE LINE LABEL INSTRUCTION .global add ! ---END PROLOG --- BEGIN BODY ------- add: ! 3 ! return a + b; .L900000105: /* 000000 3 */ retl ! Result = %o0 /* 0x0004 */ add %o0,%o1,%o0 ! ! -------END BODY ------ BEGIN EPILOG ------- ! /* 0x0008 0 */ .type add,#function /* 0x0008 0 */ .size add,(.-add) .L900000106: .section ".text",#alloc,#execinstr,#progbits .L900000107: .section ".annotate",#progbits /* 000000 0 */ .asciz "anotate" /* 0x0008 0 */ .half 6,0 /* 0x000c 0 */ .word 28 /* 0x0010 0 */ .half 0,8 /* 0x0014 0 */ .word (.L900000107-0x18) /* 0x0018 0 */ .word 24 /* 0x001c 0 */ .half 1,12 /* 0x0020 0 */ .word .L900000105 /* 0x0024 0 */ .word (.L900000106-.L900000105) /* 0x0028 0 */ .word 1577472 ! ----------------END EPILOG-------------
The purpose of the prolog is to put the body of the code into the correct context for the assembler to create an object file of executable code. The prolog creates the section where to code should go and defines the proper alignment. It also declares the entry point as global so that it can be called from another object.
The body of the function has a label for the function name and the instruction code for the function.
The epilog section declares the type and size of the function for compatibility with other tools.