################################################################################
##
## LSU EE 4720 Fall 2007 Homework 1
##
##
## Due Monday, 17 September 2007
.data
name:
.asciiz "" # Put your name between the quotes.
## Instructions:
#
# (0) Read and follow account setup instructions at
# http://www.ece.lsu.edu/ee4720/proc.html
#
# (1) Copy this assignment, local path name
# /home/classes/ee4720/com/s/hw1.s, to a directory ~/hw in your
# class account. (~ is your home directory.) Use this file for your
# solution. The TA-bot will look first for a file named ~/hw/hw1.s.
# If you have multiple versions make sure the one you want graded
# is in ~/hw/hw1.s.
#
# (2) Find the problem in this file and solve it.
#
# A procedure shell has been provided for the problem. Place
# your solution there.
#
# Assembler code following the problems runs your solutions.
# That code can be modified.
#
# Please test your code with the demo routine. (Press f9.)
# Make sure it works correctly.
#
# Your entire solution should be in this file.
#
# Do not rename the line labels in this file and be sure to use the
# directory and filename given above. (Line labels may be added.)
#
# (3) Your solution will automatically be copied from your account by
# the TA-bot. Late submissions can be E-mailed.
#
## Additional Resources
#
# MIPS Architecture Manual Volume 2 (Contains a list of instructions.)
# http://www.ece.lsu.edu/ee4720/mips32v2.pdf
# Note: SPIM implements MIPS-I instructions.
#
# SPIM Documentation:
# Appendix A of Patterson and Hennessey.
# http://www.ece.lsu.edu/3755/spim.pdf
#
# Account Setup and Emacs (Text Editor) Instructions
# http://www.ece.lsu.edu/ee4720/proc.html
# To learn Emacs look for and follow instructions for the Emacs tutorial.
#
# Unix Help
# http://www.ece.lsu.edu/v/4ltrwrd/
## Note on SPIM
#
# Clicking the close button (usually the upper-right-hand button on
# the window frame) of any window will immediately exit SPIM.
#
## SPIM Troubleshooting
#
# Make sure that the "run" dialog box shows 0x0400000 for the starting
# address. If not, __start was not properly defined, possibly due to
# an error before __start.
#
# Check the messages (bottommost) pane for syntax and other errors. It
# may be necessary to shorten other panes to make the messages pane visible.
# Common syntax errors include using "addi" instead of "add", or vice versa.
# Another common error is mistyping a label in a branch or jump target.
#
# Check the "Text Segments" pane to make sure all of your program is there.
# If not, there may have been an error reading the program.
#
# If your program does not produce the expected output modify the demo
# code so that the unexpected output comes first (if it's not
# already). Then, single-step the code (using the "step") button until
# you find the problem.
#
# If you've hit a wall ask the instructor help. It's better to
# err on the side of too many questions than too few.
################################################################################
## Problem 0
# Do the setup described in the instructions above.
#
# Before making any changes to this file (other than comments) run
# the assembler/simulator SPIM using the following steps:
#
# Load this file into an Emacs buffer using the class-account Emacs.
#
# If setup was done correctly comments should be red, "Problem 0" above
# should be in a black, bold, sans-serif font and the assembler below
# should look something like fruit salad, with pale blue mnemonics,
# italicized pseudo instructions, purple assembler directives, green
# line labels, etc.
#
# Start the SPIM assembler/simulator by pressing [F9].
# -> A window entitled "xspim" should pop up. The top pane should show
# register values, the next pane should have buttons, the third
# should show the program in binary and assembler forms, the fourth
# pane shows the data area, and the bottom pane (which might extend
# past the bottom of the screen) shows messages.
#
# Run the program by clicking the "run" button then clicking "ok" on the
# dialog box that pops up.
# -> A window entitled "SPIM Console" should pop up, the window
# should be asking you to include your name in this file. After
# a name is entered and Spim is re-run it should show four wrong
# conversions (for Problem 1). For Problem 0 that's success!!!
#
# Put your name at the top of the file then run the code in this
# file.
# -> The output window of the simulator (which might be hidden
# behind the main window) should show that the output of the unpack
# routine is "Not yet implemented." and is not the correct output.
################################################################################
## Problem 1
# The itox routine below is to convert an unsigned 32-bit integer into
# an ASCII string of its radix-R representation, where R is any power
# of 2 greater than 1. (For example, if R is 2 convert to binary, if R
# 16 convert to hexadecimal.) But wait, itox is not just any
# integer-to-string program. With itox the caller specifies the digit
# set to use. For example, when converting 5 to binary one might
# specify digit set "01" (resulting in the usual "101") or one might
# choose digit set "ft" (resulting in "tft").
# The itox routine is called with three arguments, in $a0, $a1, and $a2.
# Register $a0 holds the unsigned 32-bit integer to convert.
# Register $a1 holds the address of the digit set, a null-terminated
# string. The character at address $a1 is the digit for zero, the
# character at address $a1 + 1 is the digit for one, and so on.
# Register $a2 holds the address at which the converted string
# is to be written.
# If the number of digits in the digit set is not a power of 2 then
# itox should write a 0 at $a2 (in effect returning a zero-length
# string). Otherwise, it should write, starting at $a2, the radix-R
# representation of $a0 using the digit set provided.
# See the demo routine for an example on how itox is called.
## Complete the itox routine so that it behaves as described above.
# The correct output of itox when called by the demo routine is shown
# below. (The routine may be tested using different input.)
# HEX VAL 0x00000000 CUSTOM VAL 0 DIGIT SET 0123456789abcdef
# HEX VAL 0x00000000 CUSTOM VAL o DIGIT SET oltefsif%^@;()>+
# HEX VAL 0x00000000 CUSTOM VAL 0 DIGIT SET 01
# HEX VAL 0x00000000 CUSTOM VAL F DIGIT SET FT
# HEX VAL 0x00000000 CUSTOM VAL n DIGIT SET nesw
# HEX VAL 0x0000000e CUSTOM VAL e DIGIT SET 0123456789abcdef
# HEX VAL 0x0000000e CUSTOM VAL > DIGIT SET oltefsif%^@;()>+
# HEX VAL 0x0000000e CUSTOM VAL 1110 DIGIT SET 01
# HEX VAL 0x0000000e CUSTOM VAL TTTF DIGIT SET FT
# HEX VAL 0x0000000e CUSTOM VAL ws DIGIT SET nesw
# HEX VAL 0x1234abcd CUSTOM VAL 1234abcd DIGIT SET 0123456789abcdef
# HEX VAL 0x1234abcd CUSTOM VAL ltef@;() DIGIT SET oltefsif%^@;()>+
# HEX VAL 0x1234abcd CUSTOM VAL 10010001101001010101111001101 DIGIT SET 01
# HEX VAL 0x1234abcd CUSTOM VAL TFFTFFFTTFTFFTFTFTFTTTTFFTTFT DIGIT SET FT
# HEX VAL 0x1234abcd CUSTOM VAL ensnwenssswwnwe DIGIT SET nesw
################################################################################
## itox -- Convert unsigned integer to custom ASCII string.
## Register Usage
#
# $a0: Procedure call argument.
# Value to convert, an unsigned integer.
#
# $a1: Procedure call argument.
# Address of digit string.
#
# $a2: Procedure call argument.
# Place to put converted string.
#
# There is no return value, instead the string should be written
# into the memory at $a2.
# [ ] Do not modify registers s0-s7
# [ ] Can modify registers a0-a3, t0-t9.
# [ ] Return a zero-length string if number of digits not a power of 2.
# [ ] Make sure digits are in correct order.
# [ ] DO NOT use division or modulo instructions, instead shift & mask.
# [ ] The routine must be reasonably efficient.
# [ ] Fill as many delay slots as possible.
# [ ] Solutions with syntax errors will get low grades.
.text
itox:
## Place Solution Here
jr $ra
nop
################################################################################
## Demonstration and Test Routine
# This routine calls itox on sample numbers, and displays the original
# and converted numbers.
# It's okay to change the demo routine, below, if that will help you
# debug your code, but your code should work on the original demo
# routine and for other valid inputs.
.data # Indicate to the assembler that the stuff below is data.
#
# Message displayed if student's name omitted.
#
who_are_you:
.asciiz "Please put your name at the top of the file where indicated."
#
# Integer values to be converted.
#
values: # Assembler converts "values" to address of stuff below.
.word 0x0 # Assembler places zero in memory after label "values".
.word 0xe
.word 0x1234abcd
.word -1 # Mark end of list.
#
# Digit strings to be used when converting the numbers above.
#
digits:
.asciiz "0123456789abcdef" # Ordinary hex digits.
.asciiz "oltefsif%^@;()>+" # Use bizarre letters for hex.
.asciiz "01" # Ordinary binary.
.asciiz "FT" # False / True.
.asciiz "nesw" # Base four (north, east, south, west)
.asciiz "" # Mark end of list.
#
# Message used by demonstration routine.
#
msg:
.asciiz "HEX VAL 0x%/s3/08x CUSTOM VAL %/s2/18s DIGIT SET %/s1/s\n"
#
# Memory space to be used for result string.
#
str:
.space 256 # Tell assembler to reserve 256 characters of space.
.text # Tell assembler to put stuff below in "text" (program) segment.
.globl __start
__start:
la $s0, name
lb $s0, ($s0)
bne $s0, $0, DODEMO
la $a0, who_are_you
addi $v0, $0, 11
syscall
addi $v0, $0, 10
syscall
DODEMO:
# Put constant (address of values a few lines above) in register
# $s0 using pseudo instruction la.
la $s0, values # s0: Address of next value to use.
addi $s4, $0, -1 # s4: Value marking end of value list.
#
# Call itox for each pair of value / digit set appearing above.
#
# Outer loop - iterate over digit sets.
#
DIGITLOOP:
la $s1, digits # s1: Address of next digit set to use.
# Inner loop - iterate over values.
#
VALLOOP:
# Call itox
#
lw $a0, 0($s0) # For call to itox set $a0 to value ...
la $a2, str # ... $a2 to address of storage ...
jal itox
addi $a1, $s1, 0 # ... and $a1 to address of digit set.
# Show results of itox call.
#
lw $s3, 0($s0) # Re-load value (for display).
la $s2, str # Load address of converted string (for display).
la $a0, msg # Load address of display message.
addi $v0, $0, 11 # Load syscall code for LSU xspim's printf syscall.
syscall # Display results.
MLEN:
# Find next digit set.
#
lb $t0, 0($s1)
bne $t0, $0, MLEN
addi $s1, $s1, 1
# Use next digit set or goto first digit set and use next value.
#
lb $t0, 0($s1)
bne $t0, $0 VALLOOP # If next digit set not empty, use it.
lw $t0, 4($s0) # Load next value.
bne $t0, $s4 DIGITLOOP # If next value not end of list, use it.
addi $s0, $s0, 4
# Exit simulator.
#
MEXIT:
addi $v0, $0, 10
syscall
nop