Class 20
Class 20
• Stack Frames
• Recursion
• INVOKE, ADDR, PROC, and PROTO
• Creating Multimodule Programs
37
Recursion
• What is Recursion?
• Recursively Calculating a Sum
• Calculating a Factorial
38
What is Recursion?
E B
D C
39
Recursively Calculating a Sum
The CalcSum procedure recursively calculates the sum of an
array of integers. Receives: ECX = count. Returns: EAX = sum
CalcSum PROC
cmp ecx,0 ; check counter value
jz L2 ; quit if zero
add eax,ecx ; otherwise, add to sum
dec ecx ; decrement counter
call CalcSum ; recursive call
L2: ret
CalcSum ENDP
Stack frame:
40
Calculating a Factorial (1 of 3)
41
Calculating a Factorial (2 of 3)
Factorial PROC
push ebp
mov ebp,esp
mov eax,[ebp+8] ; get n
cmp eax,0 ; n < 0?
ja L1 ; yes: continue
mov eax,1 ; no: return 1
jmp L2
L1: dec eax
push eax ; Factorial(n-1)
call Factorial
; Instructions from this point on execute when each
; recursive call returns.
ReturnFact:
mov ebx,[ebp+8] ; get n
mul ebx ; eax = eax * ebx
L2: pop ebp ; return EAX
ret 4 ; clean up stack
Factorial ENDP
43
What's Next
• Stack Frames
• Recursion
• INVOKE, ADDR, PROC, and PROTO
• Creating Multimodule Programs
• Java Bytecodes
44
INVOKE, ADDR, PROC, and PROTO
• INVOKE Directive
• ADDR Operator
• PROC Directive
• PROTO Directive
• Parameter Classifications
• Example: Exchaning Two Integers
• Debugging Tips
45
Not in 64-bit INVOKE Directive
mode!
• In 32-bit mode, the INVOKE directive is a powerful
replacement for Intel’s CALL instruction that lets you
pass multiple arguments
• Syntax:
INVOKE procedureName [, argumentList]
• ArgumentList is an optional comma-delimited list of
procedure arguments
• Arguments can be:
• immediate values and integer expressions
• variable names
• address and ADDR expressions
• register names
46
INVOKE Examples
.data
byteVal BYTE 10
wordVal WORD 1000h
.code
; direct operands:
INVOKE Sub1,byteVal,wordVal
; address of variable:
INVOKE Sub2,ADDR byteVal
47
Not in 64-bit ADDR Operator
mode!
• Returns a near or far pointer to a variable, depending on
which memory model your program uses:
• Small model: returns 16-bit offset
• Large model: returns 32-bit segment/offset
• Flat model: returns 32-bit offset
• Simple example:
.data
myWord WORD ?
.code
INVOKE mySub,ADDR myWord
48
Not in 64-bit PROC Directive (1 of 2)
mode!
• The PROC directive declares a procedure with an
optional list of named parameters.
• Syntax:
label PROC paramList
• paramList is a list of parameters separated by
commas. Each parameter has the following syntax:
paramName : type
49
PROC Directive (2 of 2)
paramList
• The parameters can be on the same line . . .
param-1:type-1, param-2:type-2, . . ., param-n:type-n
• Or they can be on separate lines:
param-1:type-1,
param-2:type-2,
. . .,
param-n:type-n
50
AddTwo Procedure (1 of 2)
AddTwo PROC,
val1:DWORD, val2:DWORD
mov eax,val1
add eax,val2
ret
AddTwo ENDP
51
PROC Examples (2 of 3)
FillArray PROC,
pArray:PTR BYTE, fillVal:BYTE
arraySize:DWORD
mov ecx,arraySize
mov esi,pArray
mov al,fillVal
L1: mov [esi],al
inc esi
loop L1
ret
FillArray ENDP
52
PROC Examples (3 of 3)
Swap PROC,
pValX:PTR DWORD,
pValY:PTR DWORD
. . .
Swap ENDP
ReadFile PROC,
pBuffer:PTR BYTE
LOCAL fileHandle:DWORD
. . .
ReadFile ENDP
53
PROTO Directive
54
PROTO Directive
• Standard configuration: PROTO appears at top of the program
listing, INVOKE appears in the code segment, and the procedure
implementation occurs later in the program:
.code
INVOKE MySub ; procedure call
55
PROTO Example
• Prototype for the ArraySum procedure, showing its
parameter list:
ArraySum PROTO,
ptrArray:PTR DWORD, ; points to the array
szArray:DWORD ; array size
56
Parameter Classifications
• An input parameter is data passed by a calling program to a
procedure.
• The called procedure is not expected to modify the
corresponding parameter variable, and even if it does, the
modification is confined to the procedure itself.
• An output parameter is created by passing a pointer to a variable
when a procedure is called.
• The procedure does not use any existing data from the variable,
but it fills in a new value before it returns.
57
Trouble-Shooting Tips
58
What's Next
• Stack Frames
• Recursion
• INVOKE, ADDR, PROC, and PROTO
• Creating Multimodule Programs
59
Multimodule Programs
60
Advantages
• Large programs are easier to write, maintain, and
debug when divided into separate source code
modules.
• When changing a line of code, only its enclosing module
needs to be assembled again. Linking assembled
modules requires little time.
61
Creating a Multimodule Program
62
Example: ArraySum Program
• Let's review the ArraySum program from Chapter 5.
Summation
Program (main)
64
INCLUDE File
The sum.inc file contains prototypes for external functions that
are not in the Irvine32 library:
INCLUDE Irvine32.inc
PromptForIntegers PROTO,
ptrPrompt:PTR BYTE, ; prompt string
ptrArray:PTR DWORD, ; points to the array
arraySize:DWORD ; size of the array
ArraySum PROTO,
ptrArray:PTR DWORD, ; points to the array
count:DWORD ; size of the array
DisplaySum PROTO,
ptrPrompt:PTR BYTE, ; prompt string
theSum:DWORD ; sum of the array
65
Summary
• Stack parameters
• more convenient than register parameters
• passed by value or reference
• ENTER and LEAVE instructions
• Local variables
• created on the stack below stack pointer
• LOCAL directive
• Recursive procedure calls itself
• Calling conventions (C, stdcall)
• MASM procedure-related directives
• INVOKE, PROC, PROTO
66