Download Solutions - people.vcu.edu

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
EGRE 426
Homework _ Solutions
Due 9/17/07
Work the following problem in the textbook.
2.4 A subtract immediate instruction is not necessary since the addi can be
used for this function by making the offset negative.
2.6 Using MIPS instructions perform the operation:
$t0  015||$t3(22..6)
One possible solution is shown below. Why doesn’t it work?
wrong:
andi $t0, $t3, 0000_0000_0111_1111_1111_1111_11XX_XXXX
# Keep field
srl
$t0, $t3, 6 # Move field into rightmost bits
Can you find the two errors?
The immediate value must be only 16 bits. The second
instruction should be srl $t0,$t0,6
A correct solution is:
right:
sll
$t0,$t3,9
#Shift t3 left 9 places and store in t0
srl
$t0,$t0,15 #Move field to least significant end
I simulated this program using PCSPIM the actual program is shown below:
1
# Test for problem 2.6
.text
#Code goes in text segment
.globl main
#############################################
main:
sw
$ra,0($sp) #Push return address
addiu
$sp,$sp,-4 # onto stack
#
lui
$t3,0xFFD5 #Put FFD5A5AFH
ori
$t3,0xA5AF # in $t3
jal
P2_6
#Call subroutine of
problem 3.6
#
addiu
$sp,$sp,4
#Pop return address
lw
$ra,0($sp) # from stack
jr
$ra
#Return
###############################################
# FUNCTION: P2_6 $t3 <-- 0..0||$t3(22..6)
#
For example if $t0 = FFD5A5AH before
call
#
$t3 = 00015696 on return from P2_6.
#
INPUTS: $t3 - Contains field in bits 22..6
# OUTPUTS: $t0 - field in LS bits 0 elsewhere.
# DESTROYS: $t0
###############################################
P2_6:
sll
$t0,$t3,9
#Clear MS bits
srl
$t0,$t0,15
#Move fiels to LS bits
jr
$ra
#Return
2
2.13 And write MIPS assembly language to perform the same function. Let i be in $a0, x
be in $a1, and y in $a2.
loop:
add
beq
add
addi
j
$a0,$0,$0
$a0,$a1,exit
$a2,$a2,$a0
$a0,$a0,1
loop
# Set i to 0
# Exit when i = x. Assumes x positive
#y=y+i
#i=i+1
3
2.29 $a0 = a, $a1 = b
add $t0, $0, $0
# Clear $t0
loop:
beq $a1, $0, finish
# Jump to finish if $a1 = 0
add $t0, $t0, $a0
# Put running sum in $t0
addi $a1, $a1, -1
# Do loop $a1 times
j
loop
finish:
addi $t0, $t0, $100
# add 100 to a * b
add $v0, $t0, $0
# move $t0 to $v0
Program computes a*b + 100 or $v0  $a0 * $a1 + 100
My rewrite (unverified) without using the mul instruction.
addi $v0, $0, 100
# put 100 in $v0
loop:
beq $a1, $0, finish
#done if $a1 = 0
add $v0, $v0, $a0
# compute 100 + $a0*$a1
addi $a1, $a1, -1
# decrement $a1
j
loop
finish:
4
2.30
The code determines the number of matching elements between
the two arrays and returns this number in register $v0.
2.32 Show the minimal sequence of MIPS instructions for the C statement.
b = 25 | a;
ori $b, $a, 25
Here I am using $a and $b for the MIPS register that contains a and b
respectively.
5
6