1
Segmentation in Assembly Language Programming
Microprocessors (A)
Segmentation in Assembly Language Programming Fall 2004
Hadassah College
Dr. Martin Land
2
Segmentation in Assembly Language Programming
Microprocessors (A)
Segmentation in General UNIX programs have 3 segments Text segment Executable machine instructions
Data segment Initialized data
BSS segment (Block Started by Symbol) Uninitialized data
Fall 2004
Hadassah College
Dr. Martin Land
3
Segmentation in Assembly Language Programming
Microprocessors (A)
Segmentation in 8086 8086 programs begin with default segment definitions CS and DS must have pre-determined values ES and SS have some value but may not be used Some (or all) segments may overlap
Fall 2004
Hadassah College
Dr. Martin Land
4
Segmentation in Assembly Language Programming
Microprocessors (A)
Simplest Model Define separate (non-overlapping) CS, DS, SS All code sits in one CS All stack accesses refer to the one SS Both constants and variables are stored in one DS
Assembler/compiler associates a memory location to each data unit All variables are global
Can be very inefficient: A full segment is 64 KB in size No spaces between segments Small code in a 64 KB segment wastes space Fall 2004
Hadassah College
Dr. Martin Land
5
Segmentation in Assembly Language Programming
Microprocessors (A)
Modular Programming (Main + Functions) Easier to read and understand code Write, debug, and change modules independently Write some modules in high level language Compiler creates object code Machine code w/o linked addresses Write critical sections in assembly language Link together at end Local variables, pass parameters
Fall 2004
Hadassah College
Dr. Martin Land
6
Segmentation in Assembly Language Programming
Microprocessors (A)
Memory Models For Modular Programming Each code module is in a separate CS Common DS for global variables Separate DS for local variables Protection Each module has its own data area Segmentation limits access to local data segment Pass parameters on stack or in registers
Fall 2004
Hadassah College
Dr. Martin Land
7
Segmentation in Assembly Language Programming
Microprocessors (A)
Problems with Multiple Segments Every function call is a far call and requires changing CS Global/Local variables requires many DS updates Only 16 non-overlapping segments in the 8086 address space 16 × 64 KB = 24 × 216 Bytes = 220 Bytes = 1 MB
Can use overlapping segments, but lose protection
Fall 2004
Hadassah College
Dr. Martin Land
8
Segmentation in Assembly Language Programming
Microprocessors (A)
Overlapping Segments Segment is up to 64 KB, Segment base address = segment register × 10h Can begin a new segment every 16 = 10h bytes (paragraph) Example: Segment Register 1280 1240 0240 0200 0140 0100 Fall 2004
Address 12800 12400 02400 02000 01400 01000
Segment DS DS DS CS CS CS
Length Hex 400 h 400 h 10000 h 3F4 h BE5 h 3DB h Hadassah College
Round To Length Nearest KB Decimal 400 h 1024 400 h 1024 10000 h 65536 400 h 1012 C00 h 3045 400 h 987 Dr. Martin Land
9
Segmentation in Assembly Language Programming
Microprocessors (A)
Single Code Segment Modular Programming ⎯ 1
Advantages Uses Call Near functions Eliminates segment register updates Saves memory Easily integrated with high level code Fastest running programs under DOS or Windows Disadvantages Requires bookkeeping for local variables and stacks Fall 2004
Hadassah College
Dr. Martin Land
10
Segmentation in Assembly Language Programming
Microprocessors (A)
Single Code Segment Modular Programming ⎯ 2 Every module is a function (as in C) Start: Push BP onto stack Use SP as new BP (BP ← SP) Define variables based on BP [BP-02] ~ first word variable
[BP-04] ~ second word variable [BP-06] ~ third word variable Point SP at bottom of variable list End: Restore SP (SP ← BP, which was unchanged) Pop BP off stack Fall 2004
Hadassah College
Dr. Martin Land
11
Segmentation in Assembly Language Programming
Microprocessors (A)
Entry To Function Before entry to function Stack Value Stack Value
← SP (points to the last stack value)
← Old BP Stack Value Stack Value Old BP Variable Variable Empty Stack Empty Stack
Fall 2004
After entry to function ← ← ← ←
old SP BP BP – 02 BP – 04
Hadassah College
← SP
Dr. Martin Land
12
Segmentation in Assembly Language Programming
Microprocessors (A)
Single Code Segment Modular Programming ⎯ 3
Parameter passing: Calling modules Push parameters onto stack Function call pushes IP onto the stack Called function Reads (not pop) parameters from stack SP points to BP SP+02 points to IP SP+04 points to last parameter Performs function Returns single parameter in AX Returns parameter list pointer in AX Fall 2004
Hadassah College
Dr. Martin Land
13
Segmentation in Assembly Language Programming
Microprocessors (A)
On Entry To Function Stack Value Stack Value Stack Value Stack Value Passed Parameter Passed Parameter Passed Parameter Old IP Old BP Variable A Variable B Variable C
Fall 2004
← Old SP (points to the old stack value)
← ← ← ← ← ← ←
SP SP SP BP BP BP SP
after pushing passed parameters after call instruction pushes old IP after pushing old BP (also the new BP) – 02 (new variables defined in function) – 04 – 06 (also the adjusted SP) – 02 first empty stack location usable by function
Hadassah College
Dr. Martin Land
14
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 1 main() { int a = 0, x; x = function(a); a = a+1; }
int function(a) { int r; r = a + 5; return(r); } Fall 2004
Hadassah College
Dr. Martin Land
15
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 2 22CC:0000 22CC:0003
JMP 003D PUSH BP
skip to end save BP
22CC:0004 22CC:0006
MOV BP,SP SUB SP,+04
22CC:0009 22CC:000E
MOV [BP-02],0000 PUSH [BP-02]
use SP as BP adjust SP to include next 2 integers define a = 0 put a onto stack
22CC:0011
CALL 0027
call to 0027
22CC:0014 22CC:0017 22CC:001A 22CC:001D 22CC:0020 22CC:0023 22CC:0025
ADD MOV MOV ADD MOV MOV POP
remove pushed a from stack Put returned AX into x move a to AX add 1 to a AX back to a restore SP restore BP
22CC:0026
RET
Fall 2004
SP,+02 [BP-04],AX AX,[BP-02] AX,0001 [BP-02],AX SP,BP BP
return to DOS
Hadassah College
SP0=A2 BP0=00 SP1 ← SP0-02 = A0 [SP1] ← BP0 BP1 ← SP1 = A0 SP2 ← SP1-04 = 9C a = [BP1-02] = [9E] ← 0 SP3 ← SP2-02 = 9A [SP3] ← [009E] = a SP4 ← SP3-02 = 98 [SP4] ← IP = 0014 IP ← 0027 SP10 ← SP9+02 = SP2 = 9C x = [BP3-04] = [BP1-04] ← AX AX ← [BP3-02] = [BP1-02] = a
AX ← AX + 1 a = [BP3-02] = [BP1-02] ← AX
SP11 ← BP1 = SP1 = A0 BP4 ← [SP1] = BP0 = 00 SP12 ← SP11+02 = SP0 = A2
Dr. Martin Land
16
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 3 22CC:0027
PUSH BP
save BP
22CC:0028 22CC:002A 22CC:002D
MOV BP,SP SUB SP,+02 MOV AX,[BP+04]
22CC:0030 22CC:0033 22CC:0036
ADD AX,0005 MOV [BP-02],AX MOV AX,[BP-02]
22CC:0039 22CC:003B
MOV SP,BP POP BP
use SP as BP adjust SP to include next integer location of pushed argument: call: SP4 ← SP3 – 2 push BP: SP5 ← SP4 – 2 BP2 = SP5 SP4 = BP2 + 4 is where ARG was pushed add 5 to AX put AX into r put r into AX for returning (pass-by-register) restore SP restore BP
22CC:003C
RET
return to calling spot
22CC:003D
SS:
Fall 2004
Hadassah College
SP5 ← SP4-02 = 96 [SP5] ← BP1 = A0 BP2 ← SP5 = 96 SP6 ← SP5-02 = 94 AX ← [BP2+04] = [9A] = a
AX ← AX+5 = a + 5 r = [BP2-02] = [94] ← AX AX ← r = [BP2-02] SP7 ← BP2 = SP5 = 96 BP3 ← [SP7] = BP1 = A0 SP8 ← SP7+02 = SP4 = 98 IP ← [SP4] = 0014 SP9 ← SP8 + 02 = SP3 = 9A
Dr. Martin Land
17
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 4 stack value stack value
Fall 2004
← A2 = SP0 (points to the old stack value)
Hadassah College
Dr. Martin Land
18
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 5 stack value stack value 00 = BP0
Fall 2004
← A2 = SP0 (points to the old stack value) ← A0 = SP1 after pushing old BP0 (is also BP1)
Hadassah College
Dr. Martin Land
19
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 6 stack value stack value 00 = BP0 location of integer a location of integer x
Fall 2004
← ← ← ←
A2 = SP0 (points to the old stack value) A0 = SP1 after pushing old BP0 (is also BP1) 9E 9C = SP2 after adjusting for integers a and x
Hadassah College
Dr. Martin Land
20
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 7 stack value stack value 00 = BP0 location of integer a location of integer x a = 0
Fall 2004
← ← ← ← ←
A2 A0 9E 9C 9A
= SP0 (points to the old stack value) = SP1 after pushing old BP0 (is also BP1) = SP2 after adjusting for integers a and x = SP3 after pushing passed parameter a (is also BP2 + 4)
Hadassah College
Dr. Martin Land
21
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 8 stack value stack value 00 = BP0 location of integer a location of integer x a = 0 old IP = 0014
Fall 2004
← ← ← ← ← ←
A2 = SP0 (points to the old stack value) A0 = SP1 after pushing old BP0 (is also BP1) 9E 9C = SP2 after adjusting for integers a and x 9A = SP3 after pushing passed parameter a (is also BP2 + 4) 98 = SP4 after call instruction pushes old IP
Hadassah College
Dr. Martin Land
22
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 9 stack value stack value 00 = BP0 location of integer a location of integer x a = 0 old IP = 0014 BP1 = A0
Fall 2004
← ← ← ← ← ← ←
A2 = SP0 (points to the old stack value) A0 = SP1 after pushing old BP0 (is also BP1) 9E 9C = SP2 after adjusting for integers a and x 9A = SP3 after pushing passed parameter a (is also BP2 + 4) 98 = SP4 after call instruction pushes old IP 96 = SP5 after pushing BP1 (is also BP2)
Hadassah College
Dr. Martin Land
23
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 10 stack value stack value 00 = BP0 location of integer a location of integer x a = 0 old IP = 0014 BP1 = A0 location of integer r
Fall 2004
← ← ← ← ← ← ← ← ←
A2 = SP0 (points to the old stack value) A0 = SP1 after pushing old BP0 (is also BP1) 9E 9C = SP2 after adjusting for integers a and x 9A = SP3 after pushing passed parameter a (is also BP2 + 4) 98 = SP4 after call instruction pushes old IP 96 = SP5 after pushing BP1 (is also BP2) 94 = SP6 after adjusting for integer r (is also BP2 – 02) 92 = SP – 02 = first empty stack location usable by function
Hadassah College
Dr. Martin Land
24
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 11 stack value stack value 00 = BP0 location of integer a location of integer x a = 0 old IP = 0014 BP1 = A0
Fall 2004
← ← ← ← ← ← ←
A2 = SP0 (points to the old stack value) A0 = SP1 after pushing old BP0 (is also BP1) 9E 9C = SP2 after adjusting for integers a and x 9A = SP3 after pushing passed parameter a (is also BP2 + 4) 98 = SP4 after call instruction pushes old IP 96 = SP7 = SP5 after copying BP2 into SP
Hadassah College
Dr. Martin Land
25
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 12 stack value stack value 00 = BP0 location of integer a location of integer x a = 0 old IP = 0014
Fall 2004
← ← ← ← ← ←
A2 = SP0 (points to the old stack value) A0 = SP1 after pushing old BP0 (is also BP1) 9E 9C = SP2 after adjusting for integers a and x 9A = SP3 after pushing passed parameter a (is also BP2 + 4) 98 = SP8 = SP4 after popping old BP (BP3 = BP1 = 0A)
Hadassah College
Dr. Martin Land
26
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 13 stack value stack value 00 = BP0 location of integer a location of integer x a = 0
Fall 2004
← ← ← ← ←
A2 A0 9E 9C 9A
= SP0 (points to the old stack value) = SP1 after pushing old BP0 (is also BP1) = SP2 after adjusting for integers a and x = SP9 = SP3 after return instruction pops old IP
Hadassah College
Dr. Martin Land
27
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 14 stack value stack value 00 = BP0 location of integer a location of integer x
Fall 2004
← ← ← ←
A2 = SP0 (points to the old stack value) A0 = SP1 after pushing old BP0 (is also BP1) 9E 9C = SP10 = SP2 after removing passes parameter from stack
Hadassah College
Dr. Martin Land
28
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 15 stack value stack value 00 = BP0
Fall 2004
← A2 = SP0 (points to the old stack value) ← A0 = SP11 = SP1 after restoring SP from BP
Hadassah College
Dr. Martin Land
29
Segmentation in Assembly Language Programming
Microprocessors (A)
Example ⎯ 16 stack value stack value
Fall 2004
← A2 = SP12 = SP0 after popping old BP from stack
Hadassah College
Dr. Martin Land