## LSU EE 3755 -- Spring 2002 -- Computer Organization
#
## Note Set 11 -- Object Files and System Calls

# Time-stamp: <29 September 2002, 10:41:48 CDT, koppel@drop>

## Contents
#
# Structure of SPIM Assembly Language File
# SPIM and Real System Calls


## References
#
# :PH:  Patterson & Hennessy, "Computer Organization & Design"
# :Mv1: MIPS Technologies, "MIPS32 Architecture for Programmers Vol I: Intro"
# :Mv2: MIPS Technologies, "MIPS32 Architecture for Programmers Vol II: Instr"


################################################################################
## Structure of SPIM Assembly Language File

# Simplified form of a real assembly language program.

 ## What an Assembler Does
#
# Creates an object file consisting of a number of sections
# Some sections are:
#
#  :Def: Section Header
#  A directory to the other sections.
#  Used by programs that read the object file.
#
#  :Def: Text Segment
#  The program. (Encoded instructions, we know about these.)
#  Stuff that gets loaded into memory before the program is run.
#
#  :Def: Data Segment
#  Encoded data. (Haven't seen this yet. Not much to it.)
#  Stuff that gets loaded into memory before the program is run.
#
#  :Def: Symbol Table
#  A list of symbols used in the assembler file.
#  These are used for linking object files together.
#
#  :Def: Relocation Information
#  Places in object file that refer to as yet undetermined memory locations.
#
#
 ## Relevant Sections for this Class
#
# Text
# Data


 ## Assembly Program Elements
#
# Instructions
#   These should be familiar
#
# Line Labels
#   These should be familiar
#
# Assembler Directives
#   Tell the assembler how to interpret what follows.


 ## Assembler Directives
#
# These are a subset of directives recognized by real assemblers.
#
        .text
#       Tells the assembler that what follows is program code.
#       The assembler encodes instructions and places them in the text segment.
#
        .data
#       Tells the assembler that what follows is data.
#       The encoded data is placed in the data segment.
#
        .globl FOOBAR
#       Tells assembler that other files may refer to symbol FOOBAR.
#       In real assemblers, this is needed so files can be linked together.
#       In SPIM use globl to SPIM can "see" __start, the entry point.
#
        .byte 1, 2, 3, ...
        .half 1, 2, 3, ...
        .word 1, 2, 3, ...
        .float 1.1, 2.2, 3.3, ...
        .double 1.1, 2.2, 3.3, ...
#       Tell the assembler to include the specified data.  The
#       specified data is converted into the indicated format:
#       .word, 32-bit integers;  .byte, 8-bit integers.
#
        .ascii  "Hello class. I am an ascii string. I'm not terminated."
        .asciiz "Hello class. I am an ascii string, null-terminated as in C."
#       Tell the assembler to include the specified data.  Each
#       character takes up one byte of memory.  For .asciiz a zero
#       is written after the last character (which is the way it's done
#       in c).


# :Example:
#
# A short assembly language program illustrating: .data, .text, .asciiz, .globl

        .data
happy_msg:
        .asciiz "Hello, class!!"
msg2:
        .asciiz "abc"
numbers: # 0x10010000
        .byte 1, 2, 3, 4
        # 0x1004, 0x1006, 0x1008, 0x100a
halfs:
        .half 1, 2, 3, 4
        # 0x100c, 0x1010, 0x1014
        .word 1, 2, 3
        .float 1.1, 2.2, 3.3
        .double 1.1, 2.2, 3.3

        .text
        .globl __start
__start:
        la $a0, happy_msg
        addi $v0, $0, 4
        syscall
        addi $v0, $0, 10
        syscall
####


################################################################################
## SPIM and Real System Calls

# :Def: System Call
#
# (1)  A routine provided by the operating system to perform some
# action that user-level programs are not allowed to do.  System
# calls typically perform I/O, allocate memory, etc.
#
# (2)  The invocation of such a routine.

 ## Unix System Calls
#
# Details not important for this class.
#
#       Name        Number  Description
#	SYS_exit	1   Exit from program.
#	SYS_fork	2   Duplicate this (running) program.
#	SYS_read	3   Read (for example, from a file).
#	SYS_write	4   Write (for example, to a file).
#	SYS_open	5   Open a file, etc.
#	SYS_close	6   Close an open file.
#	SYS_wait	7   Wait for another program to finish.
#	SYS_creat	8   Create a new file.
#	SYS_link	9   Create an additional name for a file.
#	SYS_unlink	10  Delete one of a file's names.

 ## How System Calls Made
#
# Depends on ISA.
#
# MIPS: syscall, and other instructions.
#
# IA-32: int (software interrupt)
#
# Common Details
#
#   The system call instruction specifies a number, that
#   number identifies what the operating system is supposed
#   to do.

 ## Making SPIM System Calls
#
# System calls listed in PH Figure A.17, plus one described below.
#
# Put system call code in register $v0.
# Put parameters (if any) in registers $a0, $a1, ...
# Execute syscall instruction.

# :Syntax: syscall
#          Passes control to exception handler.
#          In SPIM, exception handler provides service indicated by $v0,
#          then returns to next instruction.

 ## SPIM System Calls
#
# The complete list in PH Figure A.17.
#
# Name       Sys Call Code  Description
# print_string   4          Print string starting at $a0.
# sbrk           9          Allocate $a0 characters of memory. Address in $v0
# exit          10          Exit program. (Return control to user.)
# printf        11          Formatted print. (LSU SPIM only.)


# :Example:
#
# Use of exit system call.  Make this call when your program is
# finished.
#
# This is the correct, officially sanctioned, way to exit from a SPIM
# program.  SPIM will also exit from a program if it reaches an
# uninitialized part of memory.

        addi $v0, $0, 10    # Load system call code
        syscall             
        add $t1, $t2, $t3   # Never reached.


# :Example:
#
# Use of a system call to print a message. 

        .data
hello:
        .asciiz "Hello, world!\n"

        .text
        .globl __start
__start:
        la $a0, hello
        addi $v0, $0, 4
        syscall
        addi $v0, $0, 10
        syscall


 ## printf System Call
#
# System Call Code: 11
# $a0:              Address of format string.
# $a1, $a2, ...     Positional parameters. (Parameters can be non-positional.)
#
# Print register contents formatted according to format string.
# Format string same as C's printf with following extension:
#  After the % can put a register number between slashes.  Data
#  will be taken from that register.
#

        .data
fmt:
        .asciiz "Index: %/t1/d, sum: %/t0/3d.\n"

        .text
        .globl __start
__start:
        addi $t0, $0, 0
        addi $t1, $0, 0
        la $a0, fmt
        j START
        addi $v0, $0, 11
LOOP:
        add $t0, $t0, $t1
        syscall
        addi $t1, $t1, 1
START:
        slti $t2, $t1, 10
        bne $t2, $0, LOOP
        nop
        addi $v0, $0, 10
        syscall