This is just a small Sparc primer giving just the basics you will need for this assignment. A more complete primer can be found at Sun's web site.


Even though we will keep our variables in the activation record on the stack or on the heap (via malloc), the Sparc commands only work with registers. You will have to move your values from memory into registers before a command and then back into memory after the command.

  %g1-7  :   global registers;  don't change value when a new function is called
             %g0 is used for temporary storage by certain commands
  %l0-7  :   local regs -> their values change when a new procedure is called
  %o0-5  :   output regs -> fill these with parameters before you call the procedure
  %i0-5  :   input regs -> in a procedure this is where the parameters are - 
             notice no more than 6 parameters to a function

General Commands

- format of a statement
	<label>:	<command>	arg [,arg[,arg]]	! comment

- basic commands
	add, sub, or, and, xor, xnor, sll, srl, sra, 
	all of these have the form:
		<command>	%regs, roi, %regd	! %regd = %regs <command> roi
	roi = register or immediate value (value is -4096 <= value < 4096)
	no extended or carry
	notice no divide or multiply commands - use C function .mul, .div
	notice no mod commands - use C function .rem

- pseudo commands
    nop, cmp, tst, set (mov), not, neg, inc, dec, clr
    not real assembly commands; the assembler (cc) will take care of
    converting these into appropriate assembly commands.  CC never uses
    psuedo ops but they make reading the assembly MUCH easier
     	clr		%reg
    	is really
    	or		%g0, %g0, %reg
- ld / st commands
	only worry about word size data
	example:	x := 99
	set		99, %l0
	st		%l0, [%fp-8]
	example:	x := x + 3  where x is being stored at %fp-8
	ld		[%fp-8], %l0
	add		%l0, 3, %l0
	st		%l0, [%fp-8]

- Branching commands
	conditions codes in icc
	N Z only - don't worry about Z & V
		<branch command>	label
	ba, bn, bne, be, bg, bge, gl, ble, bpos, bneg
	Delay slot:
		commands take more than 1 cycle - remember pipelining (fetch, decode, 
            fetch operands, execute & store),
		even with branch command you are gaurenteed the next command will 
            be executed so always do a nop after branch (same is true with
            any procedure call)
- procedure commands
	call	<label>

Code Segments

There are many different segments to an assembly program, but we only care about 2 - one for code and one for static data.

All assembly code must be defined in the text segment. To define code in the text segment, preceed a block of assembly code with the following line:


Static data (in our case, we will only do this for string literals) must be defined in the data segmnent. Preceed a block of static data with the following line:


Example of an empty function

An empty function would look like the following in Assembly. Keep in mind, that in C, main is just another function. Given that we will be using cc for the assembly, the starting execution point for all our programs will be the function main.

	.global <funcname>

	save	%sp, <funcname>_STORAGE, %sp

<funcname>_STORAGE = -96		! we are using a 2 pass assembler so this works

Your function / data can go anywhere around main; before / after - it doesn't matter.

Example of Static Data

The only static data we will be having will be strings.

	.align 4
HelloStr:     .asciz  "Hello"
ScanfStr:     .asciz  "%d"