Transcript Lecture #10

Today’s topics

Procedures



Passing values to/from procedures
Saving registers
Documenting procedures

The system stack

Review for Midterm Exam
Passing values/addresses
to/from procedures

Methods:
1.
2.
3.
Pass parameters in registers
Use shared memory (global variables)
Pass parameters on the system stack
1. Pass parameters in registers


Set up registers before call and/or before return
Generally … it’s a bad idea to pass parameters in
registers


Procedure might change/restore register contents
However


some Irvine library procedures require values in
registers (e.g., “Receives” and “Preconditions” for
ReadString)
some Irvine library procedures return values in
registers (e.g., “Returns” for ReadInt)
2. Use shared memory
(global variables)


Set up memory contents before call and/or
before return
Generally … it’s a bad idea to use global
variables


Procedure might change memory contents needed by
other procedures (unwanted side-effects)
For now … we use globals.

Later we will pass parameters on the system stack.

In all cases, when a procedure is called:

be aware of preconditions



What conditions must be true before the procedure
can perform its task?
be aware of what registers are changed
(document!)
save and restore registers if necessary
Saving registers



If a procedure changes any registers, the
calling procedure might lose important
data
Registers may be saved before call, and
restored after return
Registers may be saved by the
procedure, and restored before the
return
Saving/restoring registers

Methods:
1.
2.
Move register contents to named memory locations,
then restore after procedure returns.
Use pushad and popad
a)
b)
3.
4.
Option 1: calling procedure pushes before call, pops after
return
Option 2: procedure pushes at beginning, and pops before
the return
Use the USES directive
Save selected registers on the system stack
a)
(Much) more later about this
Method 1: Save register contents
in memory

Example (in main):
mov
aReg, eax
mov
bReg, ebx
mov
eax, count
mov
ebx, OFFSET
call
someProc
mov
eax, aReg
mov
ebx, bReg
…
;save registers
;set parameters
val
;restore registers
Methods 2: Save all registers on
the system stack*

PUSHAD pushes the 32-bit general-purpose
registers onto the stack


POPAD pops the same registers off the stack in
reverse order


order: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
Note: it’s best to use 32-bit (DWORD) operands
* More about this soon …
Method 2: Save all registers on the
system stack

Example (Option 1: in calling procedure):
pushad
;save registers
call
someProc
popad
;restore registers
…
Method 2: Save all registers on the
system stack

Example (Option 2: in the called procedure):
calcSum PROC
pushad
…
;procedure body
…
popad
ret
calcSum ENDP
;save registers
;restore registers
Method 2: Save all registers on the
system stack
 Warnings:
 Be
sure that values don't get lost.
 Be sure that the system stack is
properly aligned
 More
later …
Method 3: USES Directive




Specifies which registers will be
preserved
Saves specified registers on the system
stack before any procedure statements
are executed.
Restores registers before the procedure
returns.
MASM adds (invisible) save/restore code
for specified registers

at the beginning and end of the procedure
Method 3: USES Directive

Example (in the procedure):
calcSum PROC USES esi ecx
…
;procedure body
…
ret
calcSum ENDP

Notes:

no commas

Be careful ! USES affects the system stack
Documenting Procedures

Documentation for each procedure:





A description of all tasks accomplished by the procedure.
Receives: A list of input parameters; state usage and
requirements.
Returns: A description of values returned by the
procedure.
Preconditions: List of requirements that must be satisfied
before the procedure is called.
Registers changed: List of registers that may have
different values than they had when the procedure was
called
If a procedure is called without satisfying its preconditions, the
procedure's creator makes no promise that it will work.
Procedure Documentation
(example)
;calculate: procedure to calculate
; the summation of integers from
; a to b.
;receives: none (a, b, sum are global)
;returns: sum = a+(a+1)+ ... +b
;preconditions: a <= b
;registers changed: eax,ebx,ecx
Questions on procedures?
System Stack
(Runtime Stack)

The operating system maintains a stack



Implemented in memory
LIFO structure
Managed by the CPU, using two registers


SS: address of stack segment
ESP: stack pointer (always points to “top” of
stack)

i.e., ESP contains the address of the top of the
stack
PUSH Operation

A push operation



decrements the stack pointer by 4
copies a value into the location pointed to by
the stack pointer.
Actual decrement depends on the size of
the operand

Note: it’s best to use 32-bit (DWORD, 4-byte)
operands
Example PUSH Stack Segment in
Memory
Suppose that ecx contains 317
and esp contains 0200h.
In this case, [esp] is 25 *
The next instruction is
push ecx
Execute
push ecx
esp:
esp: 01FCh
0200h
[esp]:
[esp]: 317
25
Address
…etc
01ECh
01F0h
01F4h
01F8h
01FCh
0200h
Contents
Note: esp is decremented, then 317 is stored in the stack
*Note: [esp] means “contents of memory at the address in esp”
?
?
?
?
317?
25
POP Operation

A pop operation



Copies value at ESP into a register or variable.
increments the stack pointer by 4
Actual increment depends on the size of the
operand

Note: it’s best to use 32-bit (DWORD , 4-byte)
operands
Example POP Stack Segment in
Suppose that esp contains
01FCh.
In this case, [esp] is 317.
The next instruction is
pop
eax
Execute
pop eax
eax now contains 317
esp:
esp:
0200h
01FCh
[esp]:
[esp]: 25
317
Memory
Address
…etc
01ECh
01F0h
01F4h
01F8h
01FCh
0200h
Contents
?
?
?
?
317
25
Note: 317 is copied to EAX, then then ESP is
incremented. Memory contents unchanged.
PUSH and POP Instructions
(32-bit)

PUSH syntax:



PUSH r/m32
PUSH immed
POP syntax:

POP r/m32
Using PUSH and POP
Save and restore registers when they contain important values. POP operands
occur in the opposite of the order of PUSH operands.
push ecx
push ebx
mov
mov
; save registers
ecx,100h
ebx,0
; etc.
pop ebx
pop ecx
; restore registers
Example: Nested Loop
Push the outer loop counter before entering the inner loop.
Pop the outer loop counter when the inner loop terminates.
mov ecx,100
L1:
push ecx
; set outer loop count
; begin the outer loop
; save outer loop count
mov ecx,20
L2:
;
;
loop L2
; set inner loop count
; begin the inner loop
pop ecx
loop L1
; restore outer loop count
; repeat the outer loop
; repeat the inner loop
When not to push


Be sure that PUSH does not hide a return
address
Be sure that POP does not lose a return
address and/or replace needed values
Questions?

Midterm Exam Review
Midterm Exam

Format:




40% Calculations, definitions, short answer, multiple choice
40% MASM code tracing
20% Writing MASM code
Covers:


Lectures # 1 – 10
MASM programming




Programs #1 & 2
Homework #1
Quizzes #1 & 2
Calculator and one 8x11 notecard permitted
(both sides)

No sharing
Midterm Exam Topics

How computers work




Internal representation



Binary, decimal, hexadecimal
Peripheral devices


Numbers, characters, instructions, addresses, etc.
Floating-point, hamming codes, etc.
External representation


CISC: microprograms
Memory, CPU, registers, ALU, buses, etc.
VonNeumann architecture, Instruction Execution Cycle, pipelining,
etc.
Magnetic disk drives
IA-32 architecture


Register names, etc.
Byte-ordering (little-endian)
Midterm Exam Topics

Assembly Language





Related to high-level languages
Related to machine languages
Related to architecture
Motivations for using assembly language
Program development



Modularization
Incremental development/testing
Debugging
Midterm Exam Topics

MASM





Program structure, commenting
Assembly, linking, etc.
Segments, directives, etc.
Labels, identifiers, constants
Data types, declarations



Addressing modes


BYTE, WORD, DWORD, etc.
strings
immediate, register, direct (i.e., memory), indirect (i.e.,
[register])
Instructions:




mov, push, pop
add, sub, mul, div, inc, dec
cmp, jmp, j<condition>, loop
call, ret
Midterm Exam Topics

MASM

Control structures

Procedures, procedure calls

return address, etc
Decisions
 Repetition
 Data validation


System stack
Procedure calls and returns
 Fundamentals of push and pop
