8
Lecture 20: 11/1 2/2002 CS170 Fall 2002 1 CS170 Computer Organization and Architecture I Ayman Abdel-Hamid Department of Computer Science Old Dominion University Lecture 20: 11/12/2002

CS170 Computer Organization and Architecture I

  • Upload
    marla

  • View
    40

  • Download
    1

Embed Size (px)

DESCRIPTION

CS170 Computer Organization and Architecture I. Ayman Abdel-Hamid Department of Computer Science Old Dominion University Lecture 20: 11/12/2002. Outline. A more complex exampleProcedure sort (section 3.10) Arrays versus pointersSection 3.11. sort procedure 1/4. - PowerPoint PPT Presentation

Citation preview

Page 1: CS170 Computer Organization and Architecture I

Lecture 20: 11/12/2002 CS170 Fall 2002 1

CS170 Computer Organization and Architecture I

Ayman Abdel-Hamid

Department of Computer Science

Old Dominion University

Lecture 20: 11/12/2002

Page 2: CS170 Computer Organization and Architecture I

Lecture 20: 11/12/2002 CS170 Fall 2002 2

Outline

•A more complex example Procedure sort (section 3.10)

•Arrays versus pointers Section 3.11

Page 3: CS170 Computer Organization and Architecture I

Lecture 20: 11/12/2002 CS170 Fall 2002 3

sort procedure1/4

void sort (int v[], int n)

{

int i, j;

for (i=0; i < n; i = i+1)

for (j = i-1 ; j >= 0 && v[j] > v[j+1] ; j = j –1)

swap (v, j);

}

What is the generated MIPS assembly code?

v, n assigned to $a0, $a1

i, j assigned to registers $s0, $s1

Outer for loop

move $s0, $zero # i 0

for1tst: slt $t0,$s0,$a1 #$t0 0 if $s0 >= $a1

beq $t0, $zero, exit1 # if i >= n go to exit1

….

…..(body of loop)

addi $s0,$s0,1 # i = i +1

j for1tst # jump to test

Exit1:

Page 4: CS170 Computer Organization and Architecture I

Lecture 20: 11/12/2002 CS170 Fall 2002 4

sort procedure2/4

Inner for loop

addi $s1, $s0,-1 # j = i-1

for2tst: slti $t0,$s1,0 # $t0 1 if $s1 <0

bne $t0,$zero,exit2 # if j <0 go to exit 2

add $t1,$s1,$s1 # $t1 j *2

add $t1,$t1,$t1 # $t1 j *4

add $t2,$a0,$t1 # $t2 v + (j*4)

lw $t3 , 0($t2) #$t3 v[j]

lw $t4,4($t2) #$t4 v[j+1]

slt $t0,$t4,$t3 # $t0 0 if $t4 >= $t3

beq $t0, $zero,exit2 # if $t4 >= $t3 go to exit2

….

addi $s1.$s1,-1 # j = j-1

j for2tst # jump to test

Exit2:

void sort (int v[], int n)

{

……

for (j = i-1 ; j >= 0 && v[j] > v[j+1] ; j = j –1)

swap (v, j);

}

What is the generated MIPS assembly code?

v, n assigned to $a0, $a1

i, j assigned to registers $s0, $s1

Page 5: CS170 Computer Organization and Architecture I

Lecture 20: 11/12/2002 CS170 Fall 2002 5

sort procedure3/4

Procedure call and parameter passing

…..

move $s2,$a0 # copy $a0 into $s2

move $s3,$a1 # copy $a1 into $s3

…..

move $a0, $s2 #first swap parameter is v

move $a1,$s1 # second swap parameter is j

jal swap

Preserving registers in sort ($ra,$s0-$s3)

addi $sp,$sp,-20 # make room for 5 regs

sw $ra, 16($sp) # save $ra on stack

sw $s3,12($sp) # save $s3 on stack

..

void sort (int v[], int n)

{

……

for (j = i-1 ; j >= 0 && v[j] > v[j+1] ; j = j –1)

swap (v, j);

}

What is the generated MIPS assembly code?

v, n assigned to $a0, $a1

i, j assigned to registers $s0, $s1

swap needs parameters in $a0, $a1, then sort must save these registers before calling swap. An efficient solution stores $a0, $a1 in other registers instead of saving on stack

Page 6: CS170 Computer Organization and Architecture I

Lecture 20: 11/12/2002 CS170 Fall 2002 6

sort procedure4/4

Page 7: CS170 Computer Organization and Architecture I

Lecture 20: 11/12/2002 CS170 Fall 2002 7

Arrays versus Pointers1/2

void clear1 (int array[], int size){

int i;for ( i = 0; i < size ; i = i+1)

array[i] = 0;}

What is the generated MIPS assembly code?

void clear2 (int *array, int size){

int *p;for ( p = &array[0]; p < &array[size] ; p =p+1)

*p = 0;}

What is the generated MIPS assembly code?

move $t0, $zero #i = 0

Loop1: add $t1, $t0,$t0 #$t1 = i*2

add $t1,$t1,$t1 #$t1= i *4

add $t2,$a0,$t1 # $t2 = array + 4 *I

sw $zero,0($t2) #array[i] = 0

addi $t0,$t0,1 # i = i+1

slt $t3,$t0,$a1 # $t3 = 1 if i < size

bne $t3,$zero,loop1 # go to loop1 if more iterations

#This code works as long as size is greater than zero

move $t0, $a0 #p = address of array[0]

Loop2: sw $zero 0($t0) # Memory[p] = 0

addi $t0, $t0,4 # p = p +4

add $t1,$a1,$a1 # $t1 size * 2

add $t1,$t1,$t1 # $t1 size*4

add $t2,$a0,$t1 #$t2 address of array[size]

slt $t3,$t0,$t2 #$t3 = 1 if (p < &array[size])

bne $t3,$zero,loop2 # go to loop2 if more iterations

#This code works as long as size is greater than zero

Page 8: CS170 Computer Organization and Architecture I

Lecture 20: 11/12/2002 CS170 Fall 2002 8

Arrays versus Pointers2/2

void clear1 (int array[], int size){

int i;for ( i = 0; i < size ; i = i+1)

array[i] = 0;}

What is the generated MIPS assembly code?

void clear2 (int *array, int size){

int *p;for ( p = &array[0]; p < &array[size] ; p =p+1)

*p = 0;}

What is the generated MIPS assembly code?

move $t0, $zero #i = 0

Loop1: add $t1, $t0,$t0 #$t1 = i*2

add $t1,$t1,$t1 #$t1= i *4

add $t2,$a0,$t1 # $t2 = array + 4 *I

sw $zero,0($t2) #array[i] = 0

addi $t0,$t0,1 # i = i+1

slt $t3,$t0,$a1 # $t3 = 1 if i < size

bne $t3,$zero,loop1 # go to loop1 if more iterations

#This code works as long as size is greater than zero

A more optimized solution

move $t0, $a0 #p = address of array[0]

add $t1,$a1,$a1 # $t1 size * 2

add $t1,$t1,$t1 # $t1 size*4

add $t2,$a0,$t1 #$t2 address of array[size]

Loop2: sw $zero 0($t0) # Memory[p] = 0

addi $t0, $t0,4 # p = p +4

slt $t3,$t0,$t2 #$t3 = 1 if (p < &array[size])

bne $t3,$zero,loop2 # go to loop2 if more iterations

#This code works as long as size is greater than zero