created 06/29/2003

# Chapter 21 Programming Exercises

> For these programming exercises, use only those instructions that have been discussed so far in these notes:

> Basic Instructions
> add | div | mflo | slt, slti
> addi | divu | mult | sltu, sltiu
> addiu | j | multu | sra
> addu | lb | nor | srl
> and | lbu | or | sub
> andi | lh | ori | subu
> beq | lhu | sb | sw
> bgez | lui | sh | xor
> bltz | lw | sll | xori
> bne | mfhi |  |
> PseudoInstructions
> la | lw | nop |
> li | move | sw |

> In the Settings menu of SPIM set Bare Machine OFF, Allow Pseudo Instructions ON, Load Trap File OFF, Delayed Branches ON, Delayed Loads ON, Mapped IO OFF, Quiet OFF.

> Run the programs by setting the value of the PC to 0x400000 and then single stepping (pushing F10) or by multiple stepping (push F11 and enter a number of steps). Observing the results in the SPIM window.

> In these programs do not set up a base register and calculate a displacement by hand. Use the `lw` and `sw` instructions with symbolic addresses. Use mnemonic register names in your programs and use registers in their conventional ways.

## *Exercise 1 -- Horner's Method

(see Exercise 4 of chapter 15)

Evaluate the following polynomial using Horner's method:

    ax3 + bx2 + cx + d

Now the values for the coefficients `a, b, c, d` as well as for `x` come from the `.data` section of memory:

            .data
    x:      .word    7
    a:      .word   -3
    b:      .word    3
    c:      .word    9
    d:      .word  -24
    result: .word    0

Use the pseudoinstruction `lw` to get the coefficients from memory, and `sw` to write the result back to memory.

Click here to go back to the main menu.

## *Exercise 2 -- Pair-wise Addition

Declare three arrays, each of the same size:

             .data
    size     .word       7
    array1:  .word     -30, -23, 56, -43, 72, -18, 71
    array2:  .word      45,  23, 21, -23, -82,  0, 69
    result:  .word       0,   0,  0,   0,   0,  0,  0

Initialize a base register for each array (use the `la` instruction.) Now implement a loop that adds corresponding elements in the first two arrays and stores the result in the corresponding element of the `result` array. At the bottom of the loop adjust all three base registers.

Click here to go back to the main menu.

## ***Exercise 3 -- String Comparison

Declare two null-terminated strings:

             .data
    result:  .word     0
    string1: .asciiz   "puffin"
    string2: .asciiz   "puffins"

Initialize a base register for each string (use the `la` instruction.) Write a program that sets `result` to 1 if the two strings are equal and to 0 if the strings are not equal.

Two strings are equal if they are the same length and contain the same character in each location. Otherwise the strings are not equal.

Test your program for a variety of strings.

Extra: write the program so that it does case insensitive string comparison. Here, two strings are equal if they are the same length and have the same letter (disregarding case) in each location.

Click here to go back to the main menu.

End of Exercises