How does the stack work? On using the Pentium’s push, pop,

advertisement
How does the stack work?
On using the Pentium’s push, pop,
call, and ret instructions
Last-In, First-Out
• In concept, the ‘stack’ is a dynamic datastorage structure intended for inserting
and removing items in a LIFO discipline
• The most recently inserted item will be the
one that will be the soonest to be removed
• To ‘push’ an item means to insert it, and to
‘pop’ an item means to remove it
A stack diagram
Items are added at the top (and removed from the top)
top
Datum #2
top
empty stack
Datum #1
Datum #1
top
Before any insertions
After first push
After second push
Stack diagram (continued)
top
Datum #2
top
Datum #1
Before any removals
Datum #1
After a pop occurs
CPU’s stack grows downward
0xFFFFFFFF
stack
contents
top-of-stack
0x00000000
main memory
%esp
Effect of ‘PUSH’
• Example:
push
%eax
• This instruction will decrease the value in
register %esp by 4, and then will copy the
(4-byte) value from register %eax into the
new location at the ‘top’ of the stack area
Effect of POP
• Example:
pop %edx
• This instruction will copy the (4-byte) value
at the ‘top’ of the stack into register %edx,
and then will increase the value in %esp
by 4, to effectively ‘discard’ that location
from the ‘top’ of the stack area
Swapping register-values
• There’s a special instruction (called ‘xchg’) that
exchanges the values held in two registers
• Example:
xchg %ebx, %ecx
• But you could also get this same effect by using
a sequence of ‘push’ and ‘pop’ instructions:
push %ebx
push %ecx
pop
%ebx
pop
%ecx
CALL and RET
• The ‘call’ instruction is used to perform an
unconditional jump, while remembering
the place where you jumped from
• Example:
call subrtn
• This instruction will ‘push’ the value held in
register %eip onto the stack, and then will
copy the address of the label ‘subrtn’ into
register %eip (this accomplishes a ‘jump’)
• The ‘ret’ instruction returns from the call
Effect of RET
• Example:
ret
• This instruction ‘pops’ the value currently
at the top of the stack into register %eip
• (You’d better hope that it’s the address of
an executable instruction – else crash!!)
• Assembly programmers need to keep the
occurrences of push and pop balanced
An application ‘walk-through’
• We present a discussion of our design for
an ‘interactive’ assembly language demo
• Our design is based upon a very common
program-structure pattern (known as the
‘Input-Process-Output’ paradigm)
• We use ‘call’ and ‘ret’ instructions to follow
this organizational pattern
A human-computer dialogue
• Typical pattern:
– Computer asks a question
– Human types in a response
• Simple example:
– Computer says: How many dots?
– Human replies: 125 <ENTER>
– Computer does as requested.
Structured programming
•
•
•
•
•
A discipline for faster program design
Idea: break a big task into simple pieces
It’s known as “task decomposition”
We can use a diagram to illustrate it
Diagram is called a “Structure Chart”
Structure Chart example
main
obtain_input
process_data
print_output
Code for the ‘main’ function
main:
.section
call
call
call
ret
.text
obtain_input
process_data
print_output
.globl
main
Stubs
• You can write empty ‘stubs’ (for testing)
obtain_input:
ret
process_data:
ret
print_output:
ret
• Now you can ‘test’ your skeleton program
(e.g. assemble, link, and execute)
Add details for each ‘stub’
• First write your final subroutine, so you
can see “something” on the screen
• You can use ‘dummy’ data temporarily
• Get it working correctly (debugged)
• Then you can focus on you next ‘stub’
In-class exercise
• We left unresolved the question of how to
handle the possibility that a user might try
to type too many keystrokes
• It’s labeled ‘TODO:’ in our comments
• Can you add a ‘solution’ to this dilemma?
Download