CptS 260: Programming Project 1

Due: Wednesday, Sept. 24, 5PM

This is a relatively simple project to develop your abilities to write loops, function calls, and function definitions in assembly language. There are three parts to this assignment.

Part 1

In a file named proj1.s write a function labelled ls1bPos1 that returns the bit number of the least significant '1' bit in its argument. For this purpose we'll say that the least significant bit position in a word has bit number 0 and the most significant bit position has number 31. If the argument is zero, return -1. In writing your function observe the register conventions for the MIPS machine that we have discussed in class.

For ls1bPos1 you are to compute the answer by repeatedly shifting the argument right until there is a 1 in the least significant position, counting as you go to obtain the answer.

Write another function labelled printInt that prints its integer argument using a syscall, followed by a newline character, printed using another syscall. The code

        li      $a0, '\n'
        li      $v0, 11
        syscall
will print a newline character. Note the use of a character constant as an operand of the li instruction. Again, follow the register conventions for MIPS.

Testing Part 1

Your code for part 1 should be tested using the following code:
main:
	lui	$a0,0xF000
	jal	ls1bPos1
        move    $a0, $v0
	jal	printInt
	lui	$a0,0x0008
	jal	ls1bPos1
        move    $a0, $v0
	jal	printInt
	li	$a0,0xF400
	jal	ls1bPos1
        move    $a0, $v0
	jal	printInt
	li	$a0,1
	jal	ls1bPos1
        move    $a0, $v0
	jal	printInt
	add	$a0,$0,$0
	jal	ls1bPos1
        move    $a0, $v0
	jal	printInt
	li	$v0,10
	syscall

printInt:       # your code goes here

ls1bPos1:	# your code goes here

# the following is used beginning in part 2 of the assignment
ls1bPos2:       # your code goes here

# the following is used only in Part 3 of the assignment
        .data
testVals:
        # your test data goes here

Part 2

In the same file, write another function labelled ls1bPos2 that computes the same thing as ls1bPos1 but uses the method of repeatedly shifting a 1-bit mask to the left until it lines up with lowest-order 1 bit of the argument. Extend the code for main so that it tests both of your functions.

Part 3

The coding style for main leaves a lot to be desired: it embeds the values being tested in the program text and it has several lines of code for each value to test. For this part of the assignment rewrite main so that it tests both of your functions on an array of values stored at label testVals: in the data segment. The array ends with a zero value. The answer for the zero value must be printed. At testVals: use the .word directive to store the same values that are tested in the given main program above. This will require you to investigate the lui instruction that we have not talked about in class. Note that you can store hex values using .word by writing 0x in front of them. Thus, -1 and 0xFFFFFFFF result in the same value value in memory.

Turning in your work

Use the course turnin page to turn in your assignment. Upload a single file named proj1.s, containing your final code for ls1bPos1, ls1bPos2, printInt, and main. Please note in a comment in the source file itself which simulator you used to test your code, SPIM or MARS.