cmput229 - fall 2003

82
CMPUT 229 - Computer Org anization and Architectu re I 1 CMPUT229 - Fall 2003 TopicC: Pointers and Arrays José Nelson Amaral

Upload: brooke

Post on 08-Jan-2016

27 views

Category:

Documents


0 download

DESCRIPTION

CMPUT229 - Fall 2003. TopicC: Pointers and Arrays José Nelson Amaral. Reading Material. The slides for this topic were prepared based on chapters 17 of: Patt, Yale N., and Patel, Sanjay J., Introduction to Computing Systems: from bits & gates to C & Beyond , McGrawHill Press, 2001. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

1

CMPUT229 - Fall 2003

TopicC: Pointers and Arrays

José Nelson Amaral

Page 2: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

2

Reading Material

The slides for this topic were prepared based on chapters 17 of:

Patt, Yale N., and Patel, Sanjay J., Introduction to Computing Systems: from bits & gates to C & Beyond, McGrawHill Press, 2001.

An excellent reference book for the C Language is:

Harbison, Samuel P., and Steele Jr., Guy, C: A Reference Manual, Prentice Hall, 4th Edition, 1995.

Page 3: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

3

Example: A swap function

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Patt and Patel, pp. 366

Page 4: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

4

Assembly for Swap Generated with -O0 (part 1)

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

# 5 main() # 6 {

addiu $sp,$sp,-32 # .frame.len.mainsd $gp,16($sp) # .lcl_spill_b002sd $ra,8($sp) # .lcl_spill_b001lui $a3,%hi(%neg(%gp_rel(main +0)))addiu $a3,$a3,%lo(%neg(%gp_rel(main +0))) addu $gp,$t9,$a3

# 7 int valueA = 3;addiu $a2,$zero,3 sw $a2,0($sp) # valueA

# 8 int valueB = 4;addiu $a1,$zero,4 sw $a1,4($sp) # valueB

# 10 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);lw $a0,%got_page(.rodata)($gp) addiu $a0,$a0,%got_ofst(.rodata) lw $a1,0($sp) # valueAlw $a2,4($sp) # valueBlw $t9,%call16(printf)($gp) jalr $t9 # printfnop

$a1

Stack

$a2

$sp$a0

0

4

3

434bash-2.01$ ./swapO0

Before Swap: valueA = 3 and valueB = 4

Page 5: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

5

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Assembly for Swap Generated with -O0 (part 2)

.BB2.main: # 0x44 # 11 Swap(valueA, valueB);

lw $a0,0($sp) # valueAlw $a1,4($sp) # valueBlw $t9,%call16(Swap)($gp) jalr $t9 # Swapnop

.BB3.main: # 0x58 # 12 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);

lw $a0,%got_page(.rodata+48)($gp)addiu $a0,$a0,%got_ofst(.rodata+48)lw $a1,0($sp) # valueAlw $a2,4($sp) # valueBlw $t9,%call16(printf)($gp) jalr $t9 # printfnop

.BB4.main: # 0x74 # 13 }

or $v0,$zero,$zero ld $gp,16($sp) # .lcl_spill_b002ld $ra,8($sp) # .lcl_spill_b001addiu $sp,$sp,32 # .frame.len.mainjr $ra nop

4$a1

Stack

3$a2

43$sp

$a0 30

4

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4

Page 6: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

6

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Assembly for Swap Generated with -O0 (part 3)

# 15 void Swap(int firstVal, int secondVal) # 16 {

addiu $sp,$sp,-32 # .frame.len.Swapsw $a0,20($sp) # firstValsw $a1,28($sp) # secondVal

# 17 int tempVal; # 18 # 19 tempVal = firstVal;

lw $v1,20($sp) # firstValsw $v1,0($sp) # tempVal

# 20 firstVal = secondVal;lw $v0,28($sp) # secondValsw $v0,20($sp) # firstVal

# 21 secondVal = tempVal;lw $at,0($sp) # tempValsw $at,28($sp) # secondVal

# 22 }addiu $sp,$sp,32 # .frame.len.Swapjr $ra nop .end Swap

4$a1

3$a2

3$a0

Stack43$sp 0

4

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4

Page 7: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

7

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Assembly for Swap Generated with -O0 (part 3)

# 15 void Swap(int firstVal, int secondVal) # 16 {

addiu $sp,$sp,-32 # .frame.len.Swapsw $a0,20($sp) # firstValsw $a1,28($sp) # secondVal

# 17 int tempVal; # 18 # 19 tempVal = firstVal;

lw $v1,20($sp) # firstValsw $v1,0($sp) # tempVal

# 20 firstVal = secondVal;lw $v0,28($sp) # secondValsw $v0,20($sp) # firstVal

# 21 secondVal = tempVal;lw $at,0($sp) # tempValsw $at,28($sp) # secondVal

# 22 }addiu $sp,$sp,32 # .frame.len.Swapjr $ra nop .end Swap

4$a1

3$a2

3$a0

Stack43

$sp

3

4

$v1

$v0

3

3

4

4

$at 3

3

0

4

8

12

16

20

24

28

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4

Page 8: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

8

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Assembly for Swap Generated with -O0 (part 3)

# 15 void Swap(int firstVal, int secondVal) # 16 {

addiu $sp,$sp,-32 # .frame.len.Swapsw $a0,20($sp) # firstValsw $a1,28($sp) # secondVal

# 17 int tempVal; # 18 # 19 tempVal = firstVal;

lw $v1,20($sp) # firstValsw $v1,0($sp) # tempVal

# 20 firstVal = secondVal;lw $v0,28($sp) # secondValsw $v0,20($sp) # firstVal

# 21 secondVal = tempVal;lw $at,0($sp) # tempValsw $at,28($sp) # secondVal

# 22 }addiu $sp,$sp,32 # .frame.len.Swapjr $ra nop .end Swap

4$a1

3$a2

3$a0

4

3

3

Stack43$sp

3$v1

4$v0

$at 3

0

4

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4

Page 9: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

9

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

.BB2.main: # 0x44 # 11 Swap(valueA, valueB);

lw $a0,0($sp) # valueAlw $a1,4($sp) # valueBlw $t9,%call16(Swap)($gp) jalr $t9 # Swapnop

.BB3.main: # 0x58 # 12 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);

lw $a0,%got_page(.rodata+48)($gp)addiu $a0,$a0,%got_ofst(.rodata+48)lw $a1,0($sp) # valueAlw $a2,4($sp) # valueBlw $t9,%call16(printf)($gp) jalr $t9 # printfnop

.BB4.main: # 0x74 # 13 }

or $v0,$zero,$zero ld $gp,16($sp) # .lcl_spill_b002ld $ra,8($sp) # .lcl_spill_b001addiu $sp,$sp,32 # .frame.len.mainjr $ra nop

Assembly for Swap Generated with -O0 (part 3)

4$a1

3$a2

3$a0

4

3

3

Stack43$sp

3$v1

4$v0

$at 3

0

4

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4

Page 10: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

10

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

.BB2.main: # 0x44 # 11 Swap(valueA, valueB);

lw $a0,0($sp) # valueAlw $a1,4($sp) # valueBlw $t9,%call16(Swap)($gp) jalr $t9 # Swapnop

.BB3.main: # 0x58 # 12 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);

lw $a0,%got_page(.rodata+48)($gp)addiu $a0,$a0,%got_ofst(.rodata+48)lw $a1,0($sp) # valueAlw $a2,4($sp) # valueBlw $t9,%call16(printf)($gp) jalr $t9 # printfnop

.BB4.main: # 0x74 # 13 }

or $v0,$zero,$zero ld $gp,16($sp) # .lcl_spill_b002ld $ra,8($sp) # .lcl_spill_b001addiu $sp,$sp,32 # .frame.len.mainjr $ra nop

Assembly for Swap Generated with -O0 (part 3)

3$a1

4$a2

3$a0

4

3

3

Stack43$sp

3$v1

4$v0

$at 3

0

4

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4After Swap: valueA = 3 and valueB = 4

Page 11: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

11

Addresses and Values

The problem with our swap program is that the main is passingthe values of variables valueA and valueB to the swap function.

Thus the swap function does all its work within its own frame inthe stack and never actually changes the state of the variablesin the main function.

Could a “smarter” compiler figure out that the swap function is doing nothing? Lets try the MIPSPro compiler with -O3.

Page 12: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

12

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Assembly for Swap Generated with -O3 (part 1)

# 5 main() # 6 {

lui $a1,%hi(%neg(%gp_rel(main +0))) # [0] addiu $sp,$sp,-16 # [0] .frame.len.mainsd $gp,8($sp) # [1] .gra_spill_b002addiu $a1,$a1,%lo(%neg(%gp_rel(main +0))) # [1] addu $gp,$t9,$a1 # [2] lw $t9,%got_disp(printf)($gp) # [3] .loc 1 10 3

# 7 int valueA = 3; # 8 int valueB = 4; # 10 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);

lw $a0,%got_page(.rodata)($gp) # [4] addiu $a2,$zero,4 # [5] sd $ra,0($sp) # [5] .gra_spill_b001addiu $a1,$zero,3 # [5] jalr $t9 # [6] printfaddiu $a0,$a0,%got_ofst(.rodata) # [6]

.BB2.main: # 0x30 #<freq> BB:2 frequency = 1.00000 (heuristic)# 11 Swap(valueA, valueB);

lw $t9,%call16(Swap)($gp) # [0] addiu $a1,$zero,4 # [2] jalr $t9 # [3] Swapaddiu $a0,$zero,3 # [3]

$a1

Stack

$a2

$sp$a0

0

4

4

3

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4

Page 13: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

13

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Assembly for Swap Generated with -O3 (part 1)

# 5 main() # 6 {

lui $a1,%hi(%neg(%gp_rel(main +0))) # [0] addiu $sp,$sp,-16 # [0] .frame.len.mainsd $gp,8($sp) # [1] .gra_spill_b002addiu $a1,$a1,%lo(%neg(%gp_rel(main +0))) # [1] addu $gp,$t9,$a1 # [2] lw $t9,%got_disp(printf)($gp) # [3] .loc 1 10 3

# 7 int valueA = 3; # 8 int valueB = 4; # 10 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);

lw $a0,%got_page(.rodata)($gp) # [4] addiu $a2,$zero,4 # [5] sd $ra,0($sp) # [5] .gra_spill_b001addiu $a1,$zero,3 # [5] jalr $t9 # [6] printfaddiu $a0,$a0,%got_ofst(.rodata) # [6]

.BB2.main: # 0x30 #<freq> BB:2 frequency = 1.00000 (heuristic)# 11 Swap(valueA, valueB);

lw $t9,%call16(Swap)($gp) # [0] addiu $a1,$zero,4 # [2] jalr $t9 # [3] Swapaddiu $a0,$zero,3 # [3]

$a1

Stack

$a2

$sp$a0

0

4

4

3

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4

Page 14: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

14

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Assembly for Swap Generated with -O3 (part 3)

Swap: # 0x70.frame $sp, 0, $ra

.BB1.Swap: # 0x70 #<freq> #<freq> BB:1 frequency = 1.00000 (heuristic) #<freq> # 18 # 19 tempVal = firstVal; # 20 firstVal = secondVal; # 21 secondVal = tempVal; # 22 }

jr $ra # [0] nop # [0]

$a1

Stack

$a2

$sp$a0

0

4

4

3

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4

Page 15: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

15

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

Assembly for Swap Generated with -O3 (part 2)

.BB3.main: # 0x40 #<freq> #<freq> BB:3 frequency = 1.00000 (heuristic) #<freq>

lw $t9,%got_disp(printf)($gp) # [0] # 12 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);

lw $a0,%got_page(.rodata+48)($gp) # [1] addiu $a2,$zero,4 # [2] addiu $a1,$zero,3 # [2] jalr $t9 # [3] printfaddiu $a0,$a0,%got_ofst(.rodata+48) # [3]

.BB4.main: # 0x58 #<freq> BB:4 frequency = 1.00000 (heuristic) # 13 }

ld $ra,0($sp) # [0] .gra_spill_b001or $v0,$zero,$zero # [2] ld $gp,8($sp) # [3] .gra_spill_b002jr $ra # [3] addiu $sp,$sp,16 # [3] .frame.len.main

$a1

Stack

$a2

$sp$a0

0

4

3

4

bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4bash-2.01$ ./swapO0Before Swap: valueA = 3 and valueB = 4After Swap: valueA = 3 and valueB = 4

Page 16: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

16

What happened at -O3?

While compiling the swap code, MIPSPro figured out that it wasdoing nothing of consequence, and thus replaced the body of thefunction with a simple return instruction.

However during the compilation of main, MIPSPro did not knowwhat swap was up to, and thus could not eliminate the call toswap.

This happens because, even at -O3, MIPSPro does not do inter-procedural analysis (IPA), and thus the compilation ofeach procedure is done in isolation.

In order to force MIPSPro do perform IPA, we would have toinclude the option -ipa in the command line. But then the compiler cannot produce the assembly files because IPA actuallytakes place during the linking phase of the compiler.

Page 17: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

17

Example2: A new swap function

1 #include <stdio.h> 2 void NewSwap(int *firstVal, int *secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 NewSwap(&valueA, &valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void NewSwap(int *firstVal, int *secondVal)15 {16 int tempVal;1718 tempVal = *firstVal;19 *firstVal = *secondVal;20 *secondVal = tempVal;21 }

Patt and Patel, pp. 371

Page 18: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

18

1 #include <stdio.h> 2 void NewSwap(int *firstVal, int *secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 NewSwap(&valueA, &valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void NewSwap(int *firstVal, int *secondVal)15 {16 int tempVal;1718 tempVal = *firstVal;19 *firstVal = *secondVal;20 *secondVal = tempVal;21 }

Assembly for NewSwap Generated with -O3 (part 1) # 5 main()

# 6 {lui $a2,%hi(%neg(%gp_rel(main +0))) # [0] addiu $sp,$sp,-32 # [0] .frame.len.mainsd $gp,16($sp) # [1] .gra_spill_b002addiu $a2,$a2,%lo(%neg(%gp_rel(main +0))) # [1]

# 7 int valueA = 3;addiu $a1,$zero,3 # [2] sw $a1,0($sp) # [2] valueAaddu $gp,$t9,$a2 # [2] lw $t9,%got_disp(printf)($gp) # [3]

# 8 int valueB = 4;addiu $a3,$zero,4 # [4]

# 10 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);lw $a0,%got_page(.rodata)($gp) # [4] sd $ra,8($sp) # [5] .gra_spill_b001addiu $a2,$zero,4 # [5] addiu $a1,$zero,3 # [5] sw $a3,4($sp) # [6] valueBjalr $t9 # [6] printfaddiu $a0,$a0,%got_ofst(.rodata) # [6]

#<freq> BB:2 frequency = 1.00000 (heuristic) # 11 NewSwap(&valueA, &valueB);

lw $t9,%call16(NewSwap)($gp) # [0] addiu $a1,$sp,4 # [2] valueBjalr $t9 # [3] NewSwapaddiu $a0,$sp,0 # [3] valueA

Stack

0

4

$a2

$a3

$a0

$a1 33

4

0x7ffff0004

40x7ffff0000bash-2.01$ ./newswapO0Before Swap: valueA = 3 and valueB = 4 $sp

4

Page 19: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

19

1 #include <stdio.h> 2 void NewSwap(int *firstVal, int *secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 NewSwap(&valueA, &valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void NewSwap(int *firstVal, int *secondVal)15 {16 int tempVal;1718 tempVal = *firstVal;19 *firstVal = *secondVal;20 *secondVal = tempVal;21 }

Assembly for NewSwap Generated with -O3 (part 1)

# 15 void NewSwap(int *firstVal, int *secondVal) # 16 { # 17 int tempVal; # 18 # 19 tempVal = *firstVal;

lw $at,0($a0) # 20 *firstVal = *secondVal;

lw $v0,0($a1) sw $v0,0($a0)

# 21 *secondVal = tempVal; # 22 }

jr $ra sw $at,0($a1)

Stack43 0

4

$a2

$a3 4

$a0 0x7ffff0000

$a1 0x7ffff0004

$at

$v0

$sp

3

34

4

bash-2.01$ ./newswapO0Before Swap: valueA = 3 and valueB = 4

Page 20: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

20

Assembly for NewSwap Generated with -O3 (part 1)

1 #include <stdio.h> 2 void Swap(int firstVal, int secondVal); 3 4 main() 5 { 6 int valueA = 3; 7 int valueB = 4; 8 9 printf("Before Swap: valueA = %d and valueB = %d\n", valueA, valueB);10 Swap(valueA, valueB);11 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);12 }1314 void Swap(int firstVal, int secondVal)15 {16 int tempVal;1718 tempVal = firstVal;19 firstVal = secondVal;20 secondVal = tempVal;21 }

lw $t9,%got_disp(printf)($gp)

# 12 printf("After Swap: valueA = %d and valueB = %d\n", valueA, valueB);lw $a0,%got_page(.rodata+48)($gp)lw $a2,4($sp) # [2] valueBlw $a1,0($sp) # [3] valueAjalr $t9 # [3] printfaddiu $a0,$a0,%got_ofst(.rodata+48)

Stack34 0

4

$a2

$a3 4

$a0 0x7ffff0000

$a1 0x7ffff0004

$at 3

$v0 4

$sp

3

4

bash-2.01$ ./newswapO0Before Swap: valueA = 3 and valueB = 4bash-2.01$ ./newswapO0Before Swap: valueA = 3 and valueB = 4After Swap: valueA = 4 and valueB = 3

Page 21: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

21

The car.c program#include <stdio.h>#define STRINGLENGTH 20

typedef struct c_node{ int vehicleID; char make[STRINGLENGTH]; char model[STRINGLENGTH]; int year; int mileage; double cost; struct c_node *next;} CarNode;

void ReadCar(CarNode *car);void PrintCar(CarNode car);

main(){ CarNode mycar; ReadCar(&mycar); PrintCar(mycar);}

void ReadCar(CarNode *car){ car->vehicleID = 2; strcpy(car->make,"DODGE"); strcpy(car->model,"STRATUS"); car->year = 1996; car->mileage = 70000; car->cost = 4,525.74;}

void PrintCar(CarNode car){ printf("vehicleID: %d\n",car.vehicleID); printf("make: %s\n",car.make); printf("model: %s\n",car.model); printf("year: %d\n",car.year); printf("mileage: %d\n",car.mileage); printf("cost: %f\n",car.cost);}

Patt and Patel, pp. 419

Page 22: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

22

The car.c program

#define STRINGLENGTH 20

typedef struct c_node{ int vehicleID; char make[STRINGLENGTH]; char model[STRINGLENGTH]; int year; int mileage; double cost; struct c_node next;} CarNode;

vehicleID

make[20]

model[20]

yearmileage

cost

next

048

1216202428323640444852566064

Page 23: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

23

The car.c program#include <stdio.h>#define STRINGLENGTH 20

typedef struct c_node{ int vehicleID; char make[STRINGLENGTH]; char model[STRINGLENGTH]; int year; int mileage; double cost; struct c_node next;} CarNode;

void ReadCar(CarNode car);void PrintCar(CarNode car);

main(){ CarNode mycar; ReadCar(&mycar); PrintCar(mycar);}

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

Page 24: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

24

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t9

$t6

$t0

$t8

$t7

vehicleID

Page 25: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

25

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t9

$t0

$t8

$t7

vehicleID

$t6

vehicleID

make[0-3]

Page 26: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

26

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

vehicleID

$t6

vehicleID

make[0-3]

$t9

make[0-3]

make[4-7]

make[4-7]

Page 27: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

27

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

$t6

vehicleID

make[0-3]

$t9

make[0-3]

make[4-7]

make[4-7]

make[8-11]

Page 28: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

28

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

vehicleID

make[0-3]

$t9

make[0-3]

make[4-7]

make[8-11]

$t6

make[8-11]

make[12-15]

Page 29: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

29

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[8-11]

make[4-7]

make[0-3]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

make[8-11]

vehicleID

make[12-15]

$t9

make[12-15]

make[16-19]

make[16-19]$t6

Page 30: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

30

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[16-19]

make[12-15]

make[8-11]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

vehicleID

make[12-15]

make[0-3]

make[16-19]

make[4-7]

model[0-3]

$t6

$t9

Page 31: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

31

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[16-19]

make[12-15]

make[8-11]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

vehicleID

make[12-15]

make[0-3]

make[4-7]

model[0-3]

$t6

model[0-3]

model[4-7]

$t9

Page 32: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

32

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

model[0-3]

vehicleID

model[4-7]

$t9

model[4-7]

model[8-11]

model[8-11]$t6

Page 33: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

33

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

vehicleID

model[4-7]

make[0-3]

model[8-11]

make[4-7]

model[12-15]

$t6

$t9

Page 34: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

34

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

vehicleID

make[12-15]

make[0-3]

make[4-7]

model[12-15]

$t6

model[12-15]

model[16-19]

$t9

Page 35: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

35

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

model[12-15]

vehicleID

model[16-19]

$t9

model[16-19]

year

year$t6

Page 36: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

36

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

vehicleID

model[16-19]

make[0-3]

year

make[4-7]

mileage

$t6

$t9

Page 37: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

37

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

vehicleID

make[16-19]

make[0-3]

make[4-7]

mileage

$t6

mileage

$t9

Page 38: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

38

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

model[12-15]

vehicleID

$t9

cost1

cost1$t6

Page 39: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

39

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

vehicleID

make[0-3]

make[4-7]

$t8

$t7

$t9

cost1

$t6

cost2

Page 40: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

40

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

vehicleID

make[0-3]

make[4-7]

$t6

cost2

$t8

$t7

$t9

cost2

next

Page 41: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

41

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

cost2

vehicleID

next

next

$t9$t6

Page 42: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

42

The car.c program

main:subu $sp, 168sw $ra, 84($sp).frame $sp, 168, $ra

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 88jal ReadCar

# 27 PrintCar(mycar);addu $t6, $sp, 88move $t9, $spaddu $t0, $t6, 72

L1:lw $t8, 0($t6)addu $t6, $t6, 12sw $t8, 0($t9)lw $t7, -8($t6)addu $t9, $t9, 12sw $t7, -8($t9)lw $t8, -4($t6)sw $t8, -4($t9)bne $t6, $t0, L1lw $a0, 0($sp)lw $a1, 4($sp)lw $a2, 8($sp)lw $a3, 12($sp)jal PrintCar

# 28 }move $v0, $zerolw $ra, 84($sp)addu $sp, 168j $ra

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

$t0

$t8

$t7

cost2]

vehicleID

next

$t9

next

$t6

$a0vehicleID

$a1make[0-3]

$a2make[4-7]

$a3make[8-11]

Page 43: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

43

The car.c program # 42 void PrintCar(CarNode car) # 43 {PrintCar:

subu $sp, 32sw $ra, 28($sp)sw $a0, 32($sp)sw $a1, 36($sp)sw $a2, 40($sp)sw $a3, 44($sp)

# 44 printf("vehicleID: %d\n",car.vehicleID);la $a0, string13lw $a1, 32($sp)jal printf

# 45 printf("make: %s\n",car.make);la $a0, string14addu $a1, $sp, 32addu $a1, $a1, 4jal printf

# 46 printf("model: %s\n",car.model);la $a0, string15addu $a1, $sp, 32addu $a1, $a1, 24jal printf

# 47 printf("year: %d\n",car.year);la $a0, string16lw $a1, 76($sp)jal printf

next

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

make[0-3]

vehicleID

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

180

184

188

96

100

104

108

112116

120

124

128

132

136

140

144148

152

156

160

164

168

172

176

vehicleID

next

$a0vehicleID

$a1make[0-3]

$a2make[4-7]

$a3make[8-11]

Page 44: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

44

The car.c program # 42 void PrintCar(CarNode car) # 43 {PrintCar:

subu $sp, 32sw $ra, 28($sp)sw $a0, 32($sp)sw $a1, 36($sp)sw $a2, 40($sp)sw $a3, 44($sp)

# 44 printf("vehicleID: %d\n",car.vehicleID);la $a0, string13lw $a1, 32($sp)jal printf

# 45 printf("make: %s\n",car.make);la $a0, string14addu $a1, $sp, 32addu $a1, $a1, 4jal printf

# 46 printf("model: %s\n",car.model);la $a0, string15addu $a1, $sp, 32addu $a1, $a1, 24jal printf

# 47 printf("year: %d\n",car.year);la $a0, string16lw $a1, 76($sp)jal printf

$ra<ra>

cost2

cost1

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

make[0-3]

make[0-3]

vehicleID

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

vehicleID

next

$a0vehicleID

$a1make[0-3]

$a2make[4-7]

$a3make[8-11] SP00

04

08

12

16

20

24

28

32

96

100

104

108

112116

120

124

<ra>

Page 45: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

45

Why so much copying?

The program car.c passes the datastructure CarNodeto the PrintCar function by value.

A copy of each byte of CarNode must be made in thestack for each call of the function PrintCar.

We could, instead have passed the address of the copyof CarNode that we already had in the stack.

Page 46: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

46

The car2.c Program#include <stdio.h>#define STRINGLENGTH 20

typedef struct c_node{ int vehicleID; char make[STRINGLENGTH]; char model[STRINGLENGTH]; int year; int mileage; double cost; struct c_node next;} CarNode;

void ReadCar(CarNode car);void PrintCar(CarNode car);

main(){ CarNode mycar; ReadCar(&mycar); PrintCar(&mycar);}

void ReadCar(CarNode car){ car->vehicleID = 2; strcpy(car->make,"DODGE"); strcpy(car->model,"STRATUS"); car->year = 1996; car->mileage = 70000; car->cost = 4,525.74;}

void PrintCar(CarNode car){ printf("vehicleID: %d\n",car->vehicleID); printf("make: %s\n",car->make); printf("model: %s\n",car->model); printf("year: %d\n",car->year); printf("mileage: %d\n",car->mileage); printf("cost: %f\n",car->cost);}

Page 47: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

47

car-O0.s car2-O0.s

#include <stdio.h>#define STRINGLENGTH 20

typedef struct c_node{ int vehicleID; char make[STRINGLENGTH]; char model[STRINGLENGTH]; int year; int mileage; double cost; struct c_node next;} CarNode;

void ReadCar(CarNode car);void PrintCar(CarNode car);

main(){ CarNode mycar; ReadCar(&mycar); PrintCar(&mycar);}

main:subu $sp, 112sw $ra, 28($sp)

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 32jal ReadCar

# 27 PrintCar(&mycar);addu $a0, $sp, 32jal PrintCar

# 28 }move $v0, $zerolw $ra, 28($sp)addu $sp, 112j $ra

Page 48: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

48

car2-O0.s

main:subu $sp, 112sw $ra, 28($sp)

# 23 CarNode mycar; # 25 ReadCar(&mycar);

addu $a0, $sp, 32jal ReadCar

# 27 PrintCar(&mycar);addu $a0, $sp, 32jal PrintCar

# 28 }move $v0, $zerolw $ra, 28($sp)addu $sp, 112j $ra

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

96

100

make[0-3]

vehicleID

$a0

Page 49: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

49

car2-O0.sPrintCar:

subu $sp, 32sw $ra, 28($sp)sw $a0, 32($sp)

# 43 printf("vehicleID: %d\n",car->vehicleID);la $a0, $$13lw $t6, 32($sp)lw $a1, 0($t6)jal printf

# 44 printf("make: %s\n",car->make);la $a0, $$14lw $a1, 32($sp)addu $a1, $a1, 4jal printf

# 45 printf("model: %s\n",car->model);la $a0, $$15lw $a1, 32($sp)addu $a1, $a1, 24jal printf

# 46 printf("year: %d\n",car->year);la $a0, $$16lw $t7, 32($sp)lw $a1, 44($t7)jal printf

# 47 printf("mileage: %d\n",car->mileage);la $a0, $$17lw $t8, 32($sp)lw $a1, 48($t8)jal printf

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

SP00

04

08

12

16

20

24

28

32

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

96

100

make[0-3]

vehicleID

$a0

Page 50: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

50

car2-O0.sPrintCar:

subu $sp, 32sw $ra, 28($sp)sw $a0, 32($sp)

# 43 printf("vehicleID: %d\n",car->vehicleID);la $a0, string13lw $t6, 32($sp)lw $a1, 0($t6)jal printf

# 44 printf("make: %s\n",car->make);la $a0, string14lw $a1, 32($sp)addu $a1, $a1, 4jal printf

# 45 printf("model: %s\n",car->model);la $a0, string15lw $a1, 32($sp)addu $a1, $a1, 24jal printf

# 46 printf("year: %d\n",car->year);la $a0, string16lw $t7, 32($sp)lw $a1, 44($t7)jal printf

# 47 printf("mileage: %d\n",car->mileage);la $a0, string17lw $t8, 32($sp)lw $a1, 48($t8)jal printf

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

SP

make[0-3]

vehicleID

$a0

$ra<ra>

00

04

08

12

16

20

24

28 <ra>

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

32

96

100

104

108

112

116

120124128

132

SP+64

Page 51: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

51

car2-O0.sPrintCar:

subu $sp, 32sw $ra, 28($sp)sw $a0, 32($sp)

# 43 printf("vehicleID: %d\n",car->vehicleID);la $a0, string13lw $t6, 32($sp)lw $a1, 0($t6)jal printf

# 44 printf("make: %s\n",car->make);la $a0, string14lw $a1, 32($sp)addu $a1, $a1, 4jal printf

# 45 printf("model: %s\n",car->model);la $a0, string15lw $a1, 32($sp)addu $a1, $a1, 24jal printf

# 46 printf("year: %d\n",car->year);la $a0, string16lw $t7, 32($sp)lw $a1, 44($t7)jal printf

# 47 printf("mileage: %d\n",car->mileage);la $a0, string17lw $t8, 32($sp)lw $a1, 48($t8)jal printf

next

cost

cost

mileage

year

model[16-19]

model[12-15]

model[8-11]

model[4-7]

model[0-3]

make[16-19]

make[12-15]

make[8-11]

make[4-7]

SP

make[0-3]

vehicleID

$a0

$ra<ra>

00

04

08

12

16

20

24

28 <ra>

36

40

44

48

52

56

60

64

68

72

76

80

84

88

92

32

96

100

104

108

112

116

120124128

132

SP+64

$t6SP+64

$a1vehicleID

Page 52: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

52

Quiz #1

predecessors and successors are two vectors of unsigned integers.Assume that:

predecessors’ first element is stored at SP+32successors’ first element is stored at SP+64

Where SP points to the base of the stack frame of the current procedure.

Write a sequence of assembly instructions that executes the followingC statement:

successors[5] = predecessors[7];

Page 53: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

53

Quiz #1 - Solutionpredecessors and successors are two vectors of unsigned integers.predecessors’ first element is stored at SP+32successors’ first element is stored at SP+64

successors[5] = predecessors[7];

$t0 predecessors[7];successors[5] $t0;

$t1 Addr(predecessor[7]);$t0 0($t1);$t2 Addr(successors[5]);0($t2) $t0;

$t1 SP+32+7*4$t0 0($t1);$t2 SP+64+5*40($t2) $t0;

add $t1, $sp, 60lw $t0, 0($t1)add $t2, $sp, 84sw $t0,0($t2)

$t1 SP+60$t0 0($t1);$t2 SP+840($t2) $t0;

Page 54: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

54

Quiz #2

names is an array of pointers to strings.

Each position of names contains a pointer to a null terminated string.

Assume that the first element of names is stored in the memory position SP+16.

Write a sequence of MIPS assembly instructionsthat counts the number of characters in the string

whose pointer is at names[7].

Page 55: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

55

Quiz #2names is an array of pointers to strings. Each position of names contains a pointer to a null terminated string.Assume that the first element of names is stored in the memory position SP+16.Write a sequence of MIPS assembly instructions that counts the number of characters in the string whose pointer is at names[7].

count = 0;c = names[7];while (*c != 0) { count = count+1; c = c+1; }

$t0 0;$t1 Address(names[7]);$t2 0($t1);while (*($t2) != 0) { $t0 = $t0+1; $t2 = $t2+1; }

$t0 0;$t2 names[7];while ( *($t2) != 0) { $t0 = $t0+1; $t2 = $t2+1; }

$t0 0;$t1 SP+16+7*4$t2 0($t1);while (0($t2) != 0) { $t0 = $t0+1; $t2 = $t2+1; }

Page 56: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

56

Quiz #2names is an array of pointers to strings. Each position of names contains a pointer to a null terminated string.Assume that the first element of names is stored in the memory position SP+16.Write a sequence of MIPS assembly instructions that counts the number of characters in the string whose pointer is at names[7].

$t0 0;$t1 SP+16+7*4$t2 0($t1);while (0($t2) != 0) { $t0 = $t0+1; $t2 = $t2+1; }

add $t0, $zero, $zeroadd $t1, $sp, 44lw $t2, 0($t1)lb $t3,0($t2)beq $t3, $zero, doneaddi $t0, $t0, 1addi $t2, $t2, 1j loop;

loop:

Page 57: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

57

Quiz #3

Consider the following C function:

Write the MIPS assembly code for the first statement of this function.Assume: temp $s0 node $s1

int ReadGraph(FILE input_file, unisgned int successors, char ***names){ unsigned int temp = 0; unsigned int node = 0;

(*successors)[node] = temp; printf(“name = %d\n”,*names[node]);}

Page 58: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

58

Quiz #3 - Solution

int ReadGraph(FILE input_file, unisgned int successors, char ***names){ unsigned int temp = 0; unsigned int node;

(*successors)[node] = temp; printf(“name = %d\n”,*names[node]);}

(*successors)[node] temp;

0($a1)[node] temp;

$t0 0($a1)$t1 Address($t0[node]) 0($t1) temp;

$t0 0($a1)$t0[node] temp;

$t0 0($a1)$t1 $t0 + 4*node0($t1) temp;

lw $t0, 0($a1)sll $t2, $s1, 2add $t1, $t0, $t2sw $s0,0($t1)

Page 59: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

59

Quiz #4

Consider the following C function:

Write the MIPS assembly code to initialize the value of $a1 inthe function call to printf.

int ReadGraph(FILE input_file, unisgned int successors, char ***names){ unsigned int temp; unsigned int node;

(*successors)[node] = temp; printf(“name = %s\n”,(*names)[node]);}

Page 60: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

60

How did we ended up with names ?

$a0A d a m \0

J a m e \0s

C e c i \0l y

M u r r \0a y

Page 61: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

61

int ReadGraph(FILE input_file, unisgned int successors, char ***names){ printf(“”,(*names)[node]);}

$a2

lw $t0, 0($a2) # $t0 names

$t0

A d a m \0

J a m e \0s

C e c i \0l y

M u r r \0a y

Page 62: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

62

int ReadGraph(FILE input_file, unisgned int successors, char ***names){ printf(“”,(*names)[node]);}

lw $t0, 0($a2) # $t0 names

$a2

$t3

lw $t0, 0($a2) # $t0 nameslw $t2, 8(sp) # $t2 nodesll $t2, $t2, 2 # $t2 4nodeadd $t3, $t0, $t2 # $t3 (names) + 4node

$t0

A d a m \0

J a m e \0s

C e c i \0l y

M u r r \0a y

Page 63: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

63

int ReadGraph(FILE input_file, unisgned int successors, char ***names){ printf(“”,(*names)[node]);}

A d a m \0

J a m e \0s

C e c i \0l y

$a2

lw $t0, 0($a2) # $t0 nameslw $t2, 8(sp) # $t2 nodesll $t2, $t2, 2 # $t2 4nodeadd $t3, $t0, $t2 # $t3 (names) + 4nodelw $a1, 0(t3) # $a1 (names)[node]

$t3$a1

$t0M u r r \0a y

Page 64: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

64

int ReadGraph(FILE input_file, unisgned int successors, char ***names){ unsigned int temp; unsigned int node;

(successors)[node] = temp; printf(“name = %s\n”,(names)[node]);}

lw $t0, 0($a2) # $t0 nameslw $t2, 8(sp) # $t2 nodesll $t2, $t2, 2 # $t2 4nodeadd $t3, $t1, $t2 # $t3 (names) + 4nodelw $a1, 0(t3) # $a1 (names)[node]

Page 65: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

65

Quiz #5

Write the code for the following C function:

/* NumOfStores counts the number of store instructions that appear between the instruction pointed to by FirstInstruction and the instruction pointed to by LastInstruction */

int NumberOfStores(unsigned int FirstInstruction, unsigned int LastInstruction){}

0x23 13 13 56OpCode rs rt address

sw $13, 56($13)

For this question, we will consider that the only type of store operationavailable in the processor is a store word, such as:

100011 01101 01101 0000 0000 0011 100031 26 15 020 1625 21

Page 66: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

66

Quiz #5

/* NumOfStores counts the number of store instructions that appear between the instruction pointed to by FirstInstruction and the instruction pointed to by LastInstruction */

int NumberOfStores(unsigned int FirstInstruction, unsigned int LastInstruction){ unsigned int *instruction; int count = 0; if(LastInstruction < FirstInstruction) return 0; for(instruction = FirstInstruction ; instruction <= LastInstruction ; instruction++) if((*instruction & 0xfc000000) == 0x8c000000) count++; return count;}

0x23 13 13 56OpCode rs rt address

sw $13, 56($13)

100011 01101 01101 0000 0000 0011 100031 26 15 020 1625 21

Page 67: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

67

Quiz #6

For this quiz, assume that the only instructions that can effectcontrol flow program transfers are:

bne $s3, $s4, 8 PC PC + 4 if($1 $2) PC PC + 8

000101 10011 10100 0000 0000 0000 100031 26 15 020 1625 21

5 19 20 8OpCode rs rt address

j Exit PC concat(PC[31-28],IR[25-0])<<2

000010 00 0000 0000 0000 0000 0000 010031 26 25 0

2 4OpCode address

Page 68: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

68

Quiz #6Assume that the following C functions are available for your use in thisquiz:

/* The following functions can manipulate a bit vector of arbitrary length */unsigned int *CreateBitvector(unsigned int VectorLenght);void SetBit(unsigned int *BitVector, unsigned int BitNumber);void ResetBitRange(unsigned int *BitVector, unsigned int FirstBit, unsigned int LastBit);void ResetBit(unsigned int *BitVector, unsigned int BitNumber);

/* BBLeaders returns a bit vector where the bit corresponding to instruction i is 1 if and only if i is a basic block leader. */

unsigned int *BBLeaders(unsigned int *FirstInstruction, unsigned int *LastInstruction){}

Write the BBLeaders function:

Page 69: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

69

Quiz #6

/* BBLeaders returns a bit vector where the bit corresponding to instruction i is 1 if and only if i is a basic block leader. */void *BBLeaders(void *FirstInstruction, void *LastInstruction){ unsigned int *instruction; unsigned int *bitvector; int bitcount = 0; unsigned int opcode; unsigned int num_instructions;

if(LastInstruction <= FirstInstruction) return 0; num_instructions = LastInstruction - FirstInstruction +1; bitvector = CreateBitVector(num_instructions); ResetBitRange(bitvector,0,num_instructions-1); SetBit(bitvector,0); /* first instruction is a leader */ for(instruction = (unsigned int *) FirstInstruction ; instruction <= LastInstruction ; instruction++) { opcode = *instruction & 0xfc000000 if(opcode == 0x14000000)

{ /* process the branch instruction */ }

if(opcode == 0x08000000){ /* process jump */}

bitcount++; } return ((void *) bitvector);}

Page 70: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

70

Quiz #7Write MIPS assembly for thefollowing program.Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

ind

Stackappleptr

$sp 0

4

8

Page 71: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

71

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+4

Stackappleptr

$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 72: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

72

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+4

Stackappleptr

$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 73: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

73

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+4

Stackapple$sp+8

$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 74: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

74

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+4

Stackapple$sp+8

$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 75: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

75

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+4

Stack123

$sp+8$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 76: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

76

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+4

Stack123

$sp+8$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 77: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

77

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+8

Stack123

$sp+8$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 78: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

78

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+8

Stack123

$sp+8$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 79: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

79

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+8

Stack124

$sp+8$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 80: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

80

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+8

Stack124

$sp+8$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 81: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

81

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+8

Stack125

$sp+8$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0

Page 82: CMPUT229 - Fall 2003

CMPUT 229 - Computer Organization and Architecture I

82

Quiz #7# 7 ind = &ptr;addi $t0, $sp, 4 # $t0 &ptr sw $t0, 0($sp) # ind &ptr# 8 *ind = &apple;lw $t0, 0($sp)addi $t1, $sp,8 # $t1 &applesw $t1, 0($t0) # *ind &apple# 9 **ind = 123;addi $t3,$zero,123lw $t4, 0($sp) # $t4 *indlw $t5, 0($t4) # $t5 **indsw $t3, 0($t5) # **ind 123# 10 ind++;lw $t0, 0($sp)addi $t0, $t0, 4sw $t0, 0($sp) # ind++# 11 *ptr++;lw $t6, 4($sp) # $t6 ptrlw $t7, 0($t6) # $t7 *ptraddi $t7, $t7, 1sw $t7, 0($t6) # *ptr++# 12 apple++;lw $t8, 8(sp) # $t8 appleaddi $t8, $t8, 1sw $t8, 8(sp) # apple++

1 #include <stdio.h> 2 main() 3 { 4 int apple; 5 int *ptr; 6 int **ind;

7 ind = &ptr; 8 *ind = &apple; 9 **ind = 123;10 ind++;11 *ptr++;12 apple++;

13 printf(“%x %x %d\n”, ind, ptr, apple);14 }

$sp+8

Stack125

$sp+8$sp 0

4

8

What are the values in the stackafter line 12 is executed?Assume that:

apple $sp+8 ptr $sp+4ind $sp+0