|
|
Line 115: |
Line 115: |
| | | |
| =Exercise 5= | | =Exercise 5= |
− | Same question, but now observe that the programmer forgot the '''ret''' instruction at the end of the first function.
| + | What are the numbers stored in eax and ebx when the loop terminates? |
| {| | | {| |
| ! width="300" | | | ! width="300" | |
Line 125: |
Line 125: |
| mov ebx, 0 | | mov ebx, 0 |
| mov ecx, 10 | | mov ecx, 10 |
− | push ebx
| + | for: push ebx |
− | for: call func1
| + | call func1 |
| pop ebx | | pop ebx |
| loop for | | loop for |
Line 141: |
Line 141: |
| <font color="white"> | | <font color="white"> |
| <br> | | <br> |
− | Because ebx is restored to its original value after the call to '''func1''', the loop does '''not''' modify ebx.
| + | The loop does '''not''' modify ebx! |
| + | </font> |
| + | |} |
| + | |
| + | =Exercise 6= |
| + | Same question, but now observe that we pop eax, not ebx... |
| + | {| |
| + | ! width="300" | |
| + | ! width="300" | |
| + | |- |
| + | | |
| + | <code><pre> |
| + | mov eax, 0 |
| + | mov ebx, 0 |
| + | mov ecx, 10 |
| + | for: push ebx |
| + | call func1 |
| + | pop eax |
| + | loop for |
| + | ... |
| + | |
| + | func1: add eax, 1 |
| + | call func2 |
| + | ret |
| + | |
| + | func2: add ebx, 1 |
| + | ret |
| + | </pre></code> |
| + | | |
| + | <font color="white"> |
| + | <br> |
| + | This one requires the use of the debugger for fully understanding it! :-) |
| </font> | | </font> |
| |} | | |} |
Revision as of 07:48, 8 October 2008
Back to Weekly Schedule.
Note: Highlight the white section on the right hand-side of each code section to see the solution.
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!
|
Exercise 5
What are the numbers stored in eax and ebx when the loop terminates?
|
|
mov eax, 0
mov ebx, 0
mov ecx, 10
for: push ebx
call func1
pop ebx
loop for
...
func1: add eax, 1
call func2
ret
func2: add ebx, 1
ret
|
The loop does not modify ebx!
|
Exercise 6
Same question, but now observe that we pop eax, not ebx...
|
|
mov eax, 0
mov ebx, 0
mov ecx, 10
for: push ebx
call func1
pop eax
loop for
...
func1: add eax, 1
call func2
ret
func2: add ebx, 1
ret
|
This one requires the use of the debugger for fully understanding it! :-)
|