Difference between revisions of "CSC231 Exercises On Functions"

From dftwiki3
Jump to: navigation, search
Line 85: Line 85:
 
=Exercise 4=
 
=Exercise 4=
 
Same question, but now observe that the programmer forgot the '''ret''' instruction at the end of the first function.
 
Same question, but now observe that the programmer forgot the '''ret''' instruction at the end of the first function.
 +
{|
 +
! width="300" |  
 +
! width="300" |  
 +
|-
 +
|
 
<code><pre>
 
<code><pre>
 
mov eax, 0
 
mov eax, 0
Line 101: Line 106:
 
ret
 
ret
 
</pre></code>
 
</pre></code>
 +
|
 +
<font color="white">
 +
<br>
 +
Just go through the motion and draw the stack.  Now the problem is that when the main program calls func1 the first time, the return address for the ellipses is pushed in the stack, then the processor starts executing the '''add eax,1''' function.  Then it executes the '''call func2''' instruction and pushes the address of the '''add ebx,1''' instruction in the stack.  Then, when it executes the '''ret''' instruction, the address of '''add ebx,1''' is popped out, and ebx is incremented by 1.  Then the '''ret''' is executed and we return to the main function.  The end result is that func1 is executed once, and func2 twice!</font>
 +
|}

Revision as of 07:37, 8 October 2008

Back to Weekly Schedule.


Exercise 1

What is the behavior of this loop?

   
	mov	eax, 0
	mov	ecx, 10
for:	call	func1
	...
	loop	for


func1:	add	eax, 1
	ret


The loop goes 10 times and the function is called 10 times, adding 1 to eax every time. Eax ends with 10 in it.

Exercise 2

Same question:

   
	mov	eax, 0
	mov	ecx, 10
for:	call	func1
	...
	loop	for


func1:	sub	ecx, 1
	ret


The function decrements ecx by 1 every time through the loop. The loop is going to go twice as fast.

Exercise 3

Draw the stack as the processor executes this program:

   
	mov	eax, 0
	mov	ebx, 0
	mov	ecx, 10
for:	call	func1
	...
	loop	for



func1:	add	eax, 1
	call	func2
	ret

func2:	add	ebx, 1
	ret


Just go through the motion and draw the stack. The return address of the instruction after the call gets pushed in the stack every time the processor executes a call. It is popped out of the stack every time the processor executes a ret.

Exercise 4

Same question, but now observe that the programmer forgot the ret instruction at the end of the first function.

   
	mov	eax, 0
	mov	ebx, 0
	mov	ecx, 10
for:	call	func1
	...
	loop	for



func1:	add	eax, 1
	call	func2

func2:	add	ebx, 1
	ret


Just go through the motion and draw the stack. Now the problem is that when the main program calls func1 the first time, the return address for the ellipses is pushed in the stack, then the processor starts executing the add eax,1 function. Then it executes the call func2 instruction and pushes the address of the add ebx,1 instruction in the stack. Then, when it executes the ret instruction, the address of add ebx,1 is popped out, and ebx is incremented by 1. Then the ret is executed and we return to the main function. The end result is that func1 is executed once, and func2 twice!