################################################################################ ## ## LSU EE 4720 Spring 2004 Homework 1 ## ## ## Due Wednesday, 18 February 2004 # See http://www.ece.lsu.edu/ee4720/2004/hw01.pdf for additional questions. .data name: .asciiz "" # Put your name between the quotes. ## Instructions: # # (1) Find the undergraduate workstation laboratory, room 126 EE # building. # # (2) Locate your account. If you did not get an account please # E-mail: koppel@ece.lsu.edu # # (3) Log in to a Sun workstation. # The account should start up with a WIMP interface (windows, icons, # mouse, pull-down menus) ( :-) ) but one or two things need # to be done from a command-line shell. If you need to brush up # on Unix commands follow http://www.ece.lsu.edu/v/4ltrwrd/. # # (4) If you haven't already, follow the account setup instructions here: # http://www.ece.lsu.edu/ee4720/proc.html#entry1 # # (5) 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. # # (6) Find the problems in this file and solve them. Problem 0 is just # a check that everything is working correctly, Problem 1 is a program # that you must write and run. # # A procedure shell has been provided for the first problem. Place # your solution there. # # The first block of assembler code runs a test on your solution. # That code can be modified, for example, putting the incorrect test # case first. # # 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.) # # !! Problem one is not a research problem. It would not be difficult # to find the solution to a similar problem somewhere. Don't. # Solve it yourself, though asking for help from the professor, # TA, or other students is okay. # # (7) Your solution will automatically be copied from your account by # the TA-bot. ## 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/ ## Grading Criteria # # The code must pass the tests in this file, and similar tests. # # The code must be reasonably efficient. # # Points will be DEDUCTED for needlessly setting a register to zero!!!! # For example, instead of doing this: # add $2, $0, $0 # This instruction not needed!!!!!!!!!!!!!!!!!!! # or $2, $3, $4 # Do this: # or $2, $3, $4 ################################################################################ ## 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!!! ## Note on SPIM # # Clicking the close button (usually the upper-right-hand button on # the window frame) of any window will immediately exit 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 fails a test or otherwise does not produce the # expected output modify the test code so that the particular test it # fails 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 TA or instructor help. It's better to # err on the side of too many questions than too few. ################################################################################ ## Main Routine # This routine runs the test code for the first problem. It does not # have to be modified (other than comments), but it can be if it would # help. For example, you might comment out a test for one of the # problems when working on the other. If you're thinking of improving # your grade by deleting the test cases which your code gets wrong # you'll need to come up with a better plan. .data who_are_you: .asciiz "Please insert your name at the top of the file where indicated." TESTS: .asciiz "one two three f five " .asciiz "one two three f five" .asciiz "one" .asciiz " one" .asciiz "" MSG: .asciiz "%/$s0/d words in \"%/$s1/s\"\n" .text .globl __start __start: la $s0, name lb $s0, ($s0) bne $s0, $0, DOTESTS la $a0, who_are_you addi $v0, $0, 11 syscall addi $v0, $0, 10 syscall DOTESTS: la $s1, TESTS TLOOP: jal wc add $a0, $s1, $0 add $s0, $v0, $0 la $a0, MSG addi $v0, $0, 11 syscall nop addi $s3, $s1, 1 SLOOP: lb $s2, 0($s1) bne $s2, $0, SLOOP addi $s1, $s1, 1 bne $s1, $s3, TLOOP addi $v0, $0, 10 syscall nop ################################################################################ ## Problem 1 Solution Shell # When the routine below is called register $a0 has the address of a # null-terminated string. # # When the routine returns register $v0 should hold the number of # words in the string. For purposes of this problem a word consists # of a group of any characters except a space. There can be one or more # spaces between words. For simplicity, only consider a space (ASCII 32), # ignore tabs, linefeeds, and other whitespace characters. # # When your write your code follow the additional guidelines below. # If the register use guidelines are not followed the test code might # not work. Speed and multiplication technique are an important # part of grading. # FYI: ASCII blank is 32. atoi: ## Register Usage # # $a0: Procedure argument: pointer to string. # $v0: Return value: number of words in the string. # [ ] Code should run quickly. # [ ] Can modify registers $a0-$a3, $t0-$t9 and $v0 only. # [ ] Do not modify $s0-$s7, $sp, $fp, or $ra # [ ] Fill as many delay slots as possible. # # Note: This is an easy problem, more challenging ones will # be assigned. wc: # Insert solution here. jr $ra nop