JavaScript is required to for searching.
Skip Navigation Links
Exit Print View
SPARC Assembly Language Reference Manual     Oracle Solaris 11.1 Information Library
search filter icon
search icon

Document Information

Preface

1.  SPARC Assembler Syntax

2.  Executable and Linking Format

3.  Directives and Pseudo-Operations

4.  Creating Data in Assembler

5.  SPARC Code Models

6.  Writing Functions -- The SPARC ABI

6.1 Anatomy of a C Function

6.2 Register Usage

6.3 Parameter Passing

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

6.4.3 Additional Information

7.  Assembler Inline Functions and __asm Code

A.  Using the Assembler Command Line

B.  A Sample Assembler Program

C.  SPARC Instruction Sets and Mnemonics

Index

6.1 Anatomy of a C Function

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.