1 assembly language programming...

72
Microprocessors Assembly Language Programming 1 Dr. Martin Land Hadassah College Spring 2011 Assembly Language in 8086 Memory Architecture

Upload: hoangdieu

Post on 04-Jun-2018

231 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming1

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language in

8086 Memory Architecture

Page 2: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming2

Dr. Martin LandHadassah CollegeSpring 2011

Short Overview

Page 3: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming3

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language Programs ⎯ 1Assembly language program

List of 8086 instructions + dataCPU executes — one by one — instructions in order of listingExample:

MOV AX, BXADD AX, CXSUB AX, [BX+1234]PUSH AXMOV AH, 41INT 21

Running this program requires CPU access to memory:Code segment access ([CS:IP]) to fetch instructionsData segment access ([DS:BX+1234]) to load operandStack segment access ([SS:SP]) to execute push

Page 4: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming4

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language Programs ⎯ 2Assembly language converted to machine language

89D8 MOV AX,BX01C8 ADD AX,CX2B873412 SUB AX,[BX+1234]50 PUSH AXB441 MOV AH,41CD21 INT 21

Machine language (*.com) version of programMachine code = string of hexadecimal codes

89D801C82B87341250B441CD21

Page 5: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming5

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language Programs ⎯ 3

OS loads program to 20-bit physical addressOS loads registers

SS register ← Stack base address / 10hCopy stack to memory from address SS:SP

CS register ← Code base address / 10h

IP register ← Code base address % 10h

Copy code to memory from address CS:IP89D801C82B87341250B441CD21

ES = DS register ← Data base address / 10h

Copy data to memory from address DS:EA

00 EF CD

Stack Segment

AB ← SS:SP 21 CD 41 B4 50 12 34 87 2B C8 01 D8

Code Segment

89 ← CS:IP 12 34 56

Data Segment

78 ← DS:EA

Higher Addresses

Page 6: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming6

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language Programs ⎯ 4Assign default values to general registers

CX ← size of program (bytes)

AX = BX = DX = SI = DI = BP ← 0

Load initial values for program registersIP ← offset to first instruction in code segment

SP ← offset to first location in stack segment

Run programFetch machine instructions from code segment (CS:IP)

Access data and stack

OS services (interventions)Loading program into memory

Assigning initial values for registers in 8086

Adjusting pointers stored in program’s data segment

Page 7: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming7

Dr. Martin LandHadassah CollegeSpring 2011

80186 Architecture

Logical Address = SEGMENT:OFFSET Physical Address = SEGMENT × 10h + OFFSET

AddressBus

Control(MAR)

Decoderand

Control

StatusWord

ALU

Main Memory

GeneralRegisters

ExecutionUnit(EU)

BusInterface

Unit(BIU)

PhysicalAddress

Unit(PAU)

IPCSDS

SSES

AH ALBH BLCH CLDH DL

BP

SPSIDI

InstructionPointer

andSegmentRegisters

123456

InstructionQueue

System Bus

DataBus

Control(MDR)

ALU

ALU_IN

ALU_OUT

OFF

SEGPA

PhysicalAddress

Data

20 bits 16 bits

Control

Decoder

AXBXCX

DX

00 EF CD

Stack

AB 21 CD 41 B4 50 12 34 87 2B C8 01 D8

Code

89 12 34 56

Data

78

Page 8: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming8

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language Programs ⎯ 5DOS program files

Stored on disk or other long term storageContains

HEADER (only in *.exe files): Information for operating system

LOAD MODULE (in *.exe, *.com, *.sys files): Data , Code, Stack part of program

Loading and RunningOS copies load module into memoryOS initializes registers OS adjusts stored pointers (if file has header)OS points CS:IP at program start instruction

Page 9: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming9

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language Programs ⎯ 6Data locations

Transfer and ALU instructions refer (default) to data segment (DS)Execute SUB AX, [BX+1234]

Calculate Effective Address (EA) BX+1234Load operand from data segment address DS:BX+1234Perform AX ← AX - [DS:BX+1234]

Program must know where data is stored

Code locationsInstructions stored in memory in order of program listOS sets IP to first instruction in CSCPU updates IP after loading an instruction

IP ← address of next instructionProgram only needs to know CS:IP for branch instructions

Page 10: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming10

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language Programs ⎯ 7Branch instructions

A simple JUMP (skip over SUB and PUSH) looks like:MOV AX, BXADD AX, CXJMP L1SUB AX, [BX+1234] ; fall-through instructionPUSH AX

L1: MOV AH, 41 ; target instructionINT 21

JMP assembly coded with pointer L1 to line MOV AH, 41h

Pointer is address of target instruction

JMP machine coded with displacement to line MOV AH, 41Displacement is target address – fall-through address

Page 11: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming11

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Language Programs ⎯ 8Branch instructions

Program listing with instruction lengths:bytes instruction2 MOV AX, BX2 ADD AX, CX2 JMP L1 ; IP ← IP + 54 SUB AX, [BX+1234] ; fall-through1 PUSH AX2 L1: MOV AH, 41 ; target2 INT 21

JMP instruction ASSEMBLY CODED with IP of target

JMP instruction MACHINE CODED with displacementdisplacement = 4 + 1 = 5

Page 12: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming12

Dr. Martin LandHadassah CollegeSpring 2011

The Assembly Language Programming Process

Detailed ActionsUser ActionStage

1. Define local data structures2. Write assembly language code for

modules

1. High level design2. Organization into modules and functions

1. Place program in memory2. Set instruction pointer to program

RunLoader

Loading

1. Resolve external address references for jump and call instructions

2. Build program header3. Store executable program file on disk

RunLinker

Linking

1. Convert assembly code to machine code 2. Resolve internal references

RunAssembler

Assembly

ProgramCoding modules

PlanTop-down design

Page 13: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming13

Dr. Martin LandHadassah CollegeSpring 2011

Top-Down DesignDefine requirements for program

High Level DesignDivide problem into modules

Function — block of code to perform specific taskModule — source file containing one or more functionsProgram — one or more modules

Low Level DesignCode modules and their interfaces

Graphical or other design techniqueFlowchartPseudo-codeUse casesUMLetc

Page 14: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming14

Dr. Martin LandHadassah CollegeSpring 2011

Coding Program ModulesAssign variables to memory locations

VARIABLE NAME = SYMBOLIC LABEL for memory addressList variables and addresses in scratchpad

Used at assembly/compile timeNOT part of program listing

Code ALU operations as assembly instructionsReference to variable uses reference by pointer

Example: z = y + x

Assignments x ~ DS:0000y ~ DS:0002 ; scratchpadz ~ DS:0004

Coding MOV AX,[0000] ; AX ← x

ADD AX,[0002] ; AX ← AX + yMOV [0004],AX ; z ← AX

Page 15: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming15

Dr. Martin LandHadassah CollegeSpring 2011

Assembly by Hand ⎯ Coding Chart

Enter instructionsWrite complete assembly programList op-code (mnemonic) and operandsWrite line labels when necessary

Calculate AddressesStart with arbitrary start address

Calculate HEX codes (machine instruction) for each lineBranch instructions require knowing addresses

Address HEX Code Label Op-Code Operand Comments

Page 16: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming16

Dr. Martin LandHadassah CollegeSpring 2011

Example of Assembly Coding

a = 3, b = -1, c = 0 while (a < 10){ b = a * 2 c = b + 7 a++

} end

Implement pseudocode example:

Page 17: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming17

Dr. Martin LandHadassah CollegeSpring 2011

Assembly by Hand ⎯ Coding

address HEX code label op-code and operands comment

MOV WORD [0000],3 ; define a MOV WORD [0002],FFFF ; define b MOV WORD [0004],0 ; define c loop: CMP WORD [0000],A ; CMP a == 10 JGE end ; if a>= 10 then end MOV AX,[0000] ; AX ← a SHL AX,1 ; AX ← 2*AX MOV [0002],AX ; b ← AX ADD AX,7 ; AX ← AX+7 MOV [0004],AX ; c ← AX INC WORD [0000] ; a ← a+1 JMP loop ; back to loop end: RET ; return to DOS

a = 3, b = -1, c = 0 while (a < 10){ b = a * 2 c = b + 7 a++

} end Enter op code, line labels, comments

Page 18: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming18

Dr. Martin LandHadassah CollegeSpring 2011

Machine Language InstructionTranslate op-code and operands to HEX Code

HEX Code format for each addressing modeTranslation based on Intel op-code tables

MOV WORD PTR [0000],0003

C70600000300

Page 19: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming19

Dr. Martin LandHadassah CollegeSpring 2011

Hand Assembly ⎯ Convert to Machine Code

Enter hexadecimal code for each line

address HEX code label op-code and operands comment

C70600000300 MOV WORD [0000],3 ; define a C7060200FFFF MOV WORD [0002],FFFF ; define b C70604000000 MOV WORD [0004],0 ; define c 833E00000A loop: CMP WORD [0000],A ; CMP a == 10 7D__ JGE end ; if a>10 then end A10000 MOV AX,[0000] ; AX ← a D1E0 SHL AX,1 ; AX ← 2*AX A30200 MOV [0002],AX ; b ← AX 050700 ADD AX,7 ; AX ← AX+7 A30400 MOV [0004],AX ; c ← AX FF060000 INC WORD [0000] ; a ← a+1 EB__ JMP loop ; back to loop C3 end: RET ; return to DOS

Branch codes incomplete: Target addresses unresolved (not calculated)

Page 20: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming20

Dr. Martin LandHadassah CollegeSpring 2011

Address of Instruction in MemoryArbitrary start address

Default IP = 0000Relative to code segment base (CS)

Count instruction length (bytes in each instruction)Next address = previous address + previous instruction length

address HEX code label op-code and operands comment

0000 C70600000300 MOV WORD [0000],3 ; define a 0006 C7060200FFFF MOV WORD [0002],FFFF ; define b 000C C70604000000 MOV WORD [0004],0 ; define c 0012

000B000A0009000800070006

FFFF000206C7

Page 21: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming21

Dr. Martin LandHadassah CollegeSpring 2011

Example of Assembly Coding ⎯ Unresolved

address HEX code label op-code and operands comment

0000 C70600000300 MOV WORD [0000],3 ; define a 0006 C7060200FFFF MOV WORD [0002],FFFF ; define b 000C C70604000000 MOV WORD [0004],0 ; define c 0012 833E00000A loop: CMP WORD [0000],A ; CMP a == 10 0017 7D__ JGE end ; if a>=10 then 002D 0019 A10000 MOV AX,[0000] ; AX ← a 001C D1E0 SHL AX,1 ; AX ← 2*AX 001E A30200 MOV [0002],AX ; b ← AX 0021 050700 ADD AX,7 ; AX ← AX+7 0024 A30400 MOV [0004],AX ; c ← AX 0027 FF060000 INC WORD [0000] ; a ← a+1 002B EB__ JMP loop ; back to 0012 002D C3 end: RET ; return to DOS

Resolving branch referencesLine label = symbolic reference to instruction addressReplace line labels in code with IP address of target line

loop → 0012end → 002D

Page 22: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming22

Dr. Martin LandHadassah CollegeSpring 2011

Example of Assembly Coding ⎯ Resolving Code

address HEX code label op-code and operands comment

0000 C70600000300 MOV WORD [0000],3 ; define a 0006 C7060200FFFF MOV WORD [0002],FFFF ; define b 000C C70604000000 MOV WORD [0004],0 ; define c 0012 833E00000A loop: CMP WORD [0000],A ; CMP a == 10 0017 7D__ JGE 002D ; if a>=10 then 002D 0019 A10000 MOV AX,[0000] ; AX ← a 001C D1E0 SHL AX,1 ; AX ← 2*AX 001E A30200 MOV [0002],AX ; b ← AX 0021 050700 ADD AX,7 ; AX ← AX+7 0024 A30400 MOV [0004],AX ; c ← AX 0027 FF060000 INC WORD [0000] ; a ← a+1 002B EB__ JMP 0012 ; back to 0012 002D C3 end: RET ; return to DOS

Branch machine coded with displacement

displacement = (target address) – (fall-through address)

0017 JGE 002D: 002D – 0019 = 0014 → 14 (short) 002B JMP 0012: 0012 – 002D = FFE5 → E5 (short)

Page 23: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming23

Dr. Martin LandHadassah CollegeSpring 2011

address HEX code label op-code and operands comment

0000 C70600000300 MOV WORD [0000],3 ; define a 0006 C7060200FFFF MOV WORD [0002],FFFF ; define b 000C C70604000000 MOV WORD [0004],0 ; define c 0012 833E00000A loop: CMP WORD [0000],A ; CMP a == 10 0017 7D14 JGE 002D ; if a>=10 then 002D 0019 A10000 MOV AX,[0000] ; AX ← a 001C D1E0 SHL AX,1 ; AX ← 2*AX 001E A30200 MOV [0002],AX ; b ← AX 0021 050700 ADD AX,7 ; AX ← AX+7 0024 A30400 MOV [0004],AX ; c ← AX 0027 FF060000 INC WORD [0000] ; a ← a+1 002B EBE5 JMP 0012 ; back to 0012 002D C3 end: RET ; return to DOS

Example ⎯ Object Code with Resolved References

Page 24: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming24

Dr. Martin LandHadassah CollegeSpring 2011

Linking

Header000000000000000000000000000000 C70600000300C7060200FFFFC70604000000 833E00000A7D14A10000D1E0A30200050700 A30400FF060000EBE5C3

Program fileFile contents = Header + Load Module (data, code, stack)

No header for *.com program (no linking)

Code section = string of executable machine instructionsaddress HEX code label op-code and operands comment

0000 C70600000300 MOV WORD [0000],3 ; define a 0006 C7060200FFFF MOV WORD [0002],FFFF ; define b 000C C70604000000 MOV WORD [0004],0 ; define c 0012 833E00000A loop: CMP WORD [0000],A ; CMP a == 10 0017 7D14 JGE 002D ; if a>=10 then 002D 0019 A10000 MOV AX,[0000] ; AX ← a 001C D1E0 SHL AX,1 ; AX ← 2*AX 001E A30200 MOV [0002],AX ; b ← AX 0021 050700 ADD AX,7 ; AX ← AX+7 0024 A30400 MOV [0004],AX ; c ← AX 0027 FF060000 INC WORD [0000] ; a ← a+1 002B EBE5 JMP 0012 ; back to 0012 002D C3 end: RET ; return to DOS

link

Page 25: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming25

Dr. Martin LandHadassah CollegeSpring 2011

Simple *.com Program0100 BE1101 MOV SI,01110103 B80000 MOV AX,00106 0304 ADD AX,[SI]0108 83C602 ADD SI,2010B 833C00 CMP WORD [SI],0010E 75F6 JNZ 01060110 C3 RET0111 DW 1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,0

0110 C3 01 00 02 00 03 00 04-00 05 00 06 00 07 00 080120 00 09 00 0A 00 0B 00 0C-00 0D 00 0E 00 0F 00 00

AX = 0 → 1 → 3 → 6 → A → F → 15 → 1C →24 → 2D → 37 → 42 → 4E → 5B → 69 → 78

Page 26: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming26

Dr. Martin LandHadassah CollegeSpring 2011

String Processing Using Labels

0100 JMP L10102 S1: db "Line of Text",0,0,0,00112 S2: db "New Line",0,0,0,0,0,0,0,00122 L1: MOV DI,0080 ; destination0125 LEA SI,[S1] ; source_10129 CALL L2 ; call copy012C LEA SI,[S2] ; source_20130 CALL L2 ; call copy0133 RET ; end of main routine0134 L2: LODSB ; AL ← [SI], SI++0135 STOSB ; [DI] ← AL, DI++0136 CMP AL,000138 JNZ L2013A RET

Page 27: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming27

Dr. Martin LandHadassah CollegeSpring 2011

String Processing without Labels

0100 JMP 01220102 db "Line of Text",0,0,0,00112 db "New Line",0,0,0,0,0,0,0,00122 MOV DI,0080 ; destination0125 LEA SI,[0102] ; source_10129 CALL 0134 ; call copy012C LEA SI,[0112] ; source_20130 CALL 0134 ; call copy0133 RET ; end of main routine0134 LODSB ; AL ← [SI], SI++0135 STOSB ; [DI] ← AL, DI++0136 CMP AL,000138 JNZ 0134013A RET

Page 28: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming28

Dr. Martin LandHadassah CollegeSpring 2011

Arithmetic: Stored Data, Variables, and Pointers0100 LEA SI,[0106]0104 JMP 010A0106 DW 00000108 DW 0000010A MOV [SI+2],DS010D LEA AX,[0132]0111 CWD0112 MOV BX,100115 DIV BX0117 ADD [SI+2],AX011A MOV [SI],DX011C LDS SI,[SI]011E LEA BX,[SI]0120 ADD SI,4

0123 LODSW0124 IMUL WORD [BX]0126 MOV [BX+02],AX0129 MOV [BX+04],DX012C CMP WORD [SI],0012F JNZ 01230131 RET0132 DW 1122,00136 DW 1,2,3,4,5,6,7,80146 DW 9,a,b,c,d,e,f,0

Page 29: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming29

Dr. Martin LandHadassah CollegeSpring 2011

Assembly Programming — Matters of StyleDifferent methods are possible for:

DOS *.exe and *.com programsModular programmingSegmentationAllocating memory for data Creating loops and control flowDefining function calls

Standard programming stylesAssembler programming models

Coding in native assembly language development environment

C language model Assembly coding according to C language requirementsFor combining assembly and C code into one program

Page 30: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming30

Dr. Martin LandHadassah CollegeSpring 2011

Program File TypesDOS/Windows

.com file = Load ModuleVery simple programs Limited to one segment CS = DS = SS = ESNo Program HeaderFirst instruction at IP = 0100

.exe file = DOS Header + Load ModuleUses multiple segments and allows far branchesOS provides value for DSHeader contains initial values for CS:IP, SS:SPHeader contains other OS parameters

Unix/Linux (on PC)ELF file = ELF Header + Load Module

Use one only segment CS = DS = SS = ESUses advanced 32-bit processor features

Page 31: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming31

Dr. Martin LandHadassah CollegeSpring 2011

Modular Programming (Main + Functions)Build program from separate source files (modules)

Each source module edited in a separate fileCompile or Assemble source files into separate object files

Object code is machine code with symbolic external referencesLink object files together to create executable fileEasier to design, read and understand programs

Write most modules in high level language Write critical sections in assembly language Write, debug, and change modules independently

main.C

f1.ASM

f2.C

compile

assemble

compile

main.OBJ

f1.OBJ

f2.OBJ

f_std.LIB

link prog.EXE

load

Page 32: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming32

Dr. Martin LandHadassah CollegeSpring 2011

LinkingStore executable program file on disk

Required for DOS *.exe files and Linux executable filesPlace segments into standard orderCreate program header

For programs compiled/assembled from separate source filesCombines separate OBJECT CODE modulesResolves EXTERNAL REFERENCES between modules

localized *.exe file unified *.exe file

Function Stack Function Code

Unified Stack

Function Data Function Code Main Stack Main Code Main Code Main Data

Unified Data

Program Header Program Header

Higher Addresses

function.obj

Function Stack Function Code Function Data

main.obj

Main Stack Main Code Main Data

Page 33: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming33

Dr. Martin LandHadassah CollegeSpring 2011

Program Modules and Resolving References

Main module file — main.asm

main: MOV AX,BXADD AX,[0012] ; pass parameter in AXCALL function ; external reference

; resolved by linkerend: RET

Function module file — function.asm

function: MOV CX,20up: MUL CX ; AX ← AX * CX

LOOP up ; CX ← CX – 1

; if CX > 0 IP ← up; internal reference; resolved by assembler

RET

Page 34: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming34

Dr. Martin LandHadassah CollegeSpring 2011

Logical Offset — ParagraphsLogical address to physical address

SEG:OFF → PA = SEG × 10h + OFF

Physical address to logical addressPA → SEG:OFF = (PA / 10h):(PA % 10h)

Paragraph10h bytes = smallest 8086 segment

Logical OffsetN byte offset → (N / 10h):(N % 10h)

Logical Offset = (N / 10h):(N % 10h)

Physical Offset = N bytes N / 10h paragraphs

N % 10h bytes

Page 35: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming35

Dr. Martin LandHadassah CollegeSpring 2011

Load

Store

DOS Program in Main Memory

User memory Begins at DS:0000 — DOS always sets DS to point at PSPDS paragraphs = DS × 10h bytes from start of RAM

User program (load module)Begins at start_segment:0000 = DS:0100 (PSP = 100h bytes)DS:0100 → DS × 10h + 0100 = (DS + 10) × 10h + 0000

start_segment = DS + 10 ⇒ DS = start_segment - 10

User Program

Program Segment Prefix(PSP)

DOS System Kernelstart of RAM0000:0000

start of user memoryDS:0000

start of loaded user programstart_segment:0000

loadedfromdisk

100h bytesinserted by DOS

Page 36: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming36

Dr. Martin LandHadassah CollegeSpring 2011

The Program Segment Prefix (PSP)Offset Size Contents 0000h 2 bytes int 20h (old style program terminate command) 0005h 5 bytes Far call to DOS function handler 000Ah 4 bytes Previous termination handler interrupt vector (int 22h) 000Eh 4 bytes Previous contents of ctrl-C interrupt vector (int 23h) 0012h 4 bytes Previous critical error handler interrupt vector (int 24h) 002Ch 2 bytes Segment address of the program's environment block

0080h 1 byte Argument length Number of characters — including spaces — following program name

0081h 127 bytes Argument (command tail) Command tail

All characters (including spaces) after file name Example

format a: /q command tail = " a: /q" command tail contains 6 characters command tail terminated by character 0x0d

Disk Transfer Area (DTA) DOS functions use PSP:0080 — PSP:00FF as write buffer Must save Command Tail before overwriting

Page 37: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming37

Dr. Martin LandHadassah CollegeSpring 2011

Loading Program Argumentsorg 0x100

section .dataargv: times 127 db 0 ; stores command tail

section .textmov si, 0x81 ; SI <-- pointer to command tailmov di, argv ; DI <-- pointer to command tail buffer

L1: lodsb ; al <-- character from command tailcmp al, 0x20 ; ignore initial spaces (0x20 characters)jne L2sjmp L1

L2: lodsb ; get file name characterL2s: cmp al, 0x0d ; end on 0x0d character

je L3stosb ; copy character to file name bufferjmp L2

;L3:; user program;end: MOV AH,4Ch ; exit

INT 21h ; call DOS

Page 38: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming38

Dr. Martin LandHadassah CollegeSpring 2011

start_segment

load module

PSP

DS = CS = SS = ES= start_segment - 10

File on Disk File in RAM

IncreasingAddresses

Load

code

data and

stack

morecode

code

data andstack

morecode

JMP NEAR

DS:EA

SS:SP

Load ModuleCode+Data+Stack stored in *.com program file on diskCopied to RAM at start_segment (after 100h bytes of PSP)

Single 64 KB segmentCS = DS = SS = ESProgram codes starts at IP = 0100 (after 100h bytes of PSP)

DOS *.com Program

DOS

Page 39: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming39

Dr. Martin LandHadassah CollegeSpring 2011

Template for *.com ProgramORG 0x100

section .data; define initiated data

section .bss; define uninitiated data

section .text; code instructionsmov ax,4C00hint 21h

Page 40: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming40

Dr. Martin LandHadassah CollegeSpring 2011

*.com Example ⎯ 1ex1.asm ORG 0x100 section .data var1 dw 0x1234 ; var1 labels address of data section .text mov ax, ds add ax, 10h mov cx, ax mov bx, ax mov ax, [var1] ; NASM keeps track of variable mov ah,4ch int 21h ret C:\nasm\programs\examples>nasm ex1.asm

Page 41: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming41

Dr. Martin LandHadassah CollegeSpring 2011

*.com Example ⎯ 2C:\nasm\programs\examples>debug ex1 -u 0B0E:0100 8CD8 MOV AX,DS 0B0E:0102 051000 ADD AX,0010 0B0E:0105 89C1 MOV CX,AX 0B0E:0107 89C3 MOV BX,AX 0B0E:0109 A11401 MOV AX,[0114] ; NASM "knows" pointer 0B0E:010C B44C MOV AH,4C 0B0E:010E CD21 INT 21 0B0E:0110 C3 RET 0B0E:0111 0000 ADD [BX+SI],AL 0B0E:0113 0034 ADD [SI],DH ; value of var1 at 0114 0B0E:0115 1246EA ADC AL,[BP-16] 0B0E:0118 8956EC MOV [BP-14],DX 0B0E:011B 8B34 MOV SI,[SI] 0B0E:011D 00FD ADD CH,BH 0B0E:011F 0A8B46EA OR CL,[BP+DI+EA46] -r AX=0000 BX=0000 CX=0016 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B0E ES=0B0E SS=0B0E CS=0B0E IP=0100 NV UP EI PL NZ NA PO NC 0B0E:0100 8CD8 MOV AX,DS

Page 42: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming42

Dr. Martin LandHadassah CollegeSpring 2011

Labels and VariablesNASM associates a string with an address

LABEL = pointer (start address) to line of code VARIABLE = pointer (start address) to data declaration

Label arithmeticMOV AX,[var1 + 2]

AX ← word after value of variable var1Label arithmetic performed at assembly timeAssembler

Keeps track of addressesPerforms arithmeticUses numerical results in instructions

Example: var1 labels a variable defined at DS:0006MOV AX,[var1 + 2] coded as MOV AX,[0008]

Page 43: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming43

Dr. Martin LandHadassah CollegeSpring 2011

EQU Example — 1 org 0x100 section .data

message1 db 'hello, world' message2 db '123456789' here equ $ ; $ = &('9')+1 ; here = numerical constant <— value &('9')+1 msglen2 equ here-message2 ; message2 = address of '1' = &('1') ; msglen2 = &('9')+1 – &('1') ; = length of string message2 message3 db 'goodbye, world'

section .text mov ax, message1 mov bx, here mov cx, msglen2 mov ax,4C00H INT 21H

Page 44: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming44

Dr. Martin LandHadassah CollegeSpring 2011

EQU Example — 2

C:\nasm\programs\examples>debug ex7.com

-r

AX=0000 BX=0000 CX=0033 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000

DS=0B60 ES=0B60 SS=0B60 CS=0B60 IP=0100 NV UP EI PL NZ NA PO NC

-u

0B60:0100 B81001 MOV AX,0110 ; pointer message1

0B60:0103 BB2501 MOV BX,0125 ; value of here = &('9')+1

0B60:0106 B90900 MOV CX,0009 ; string length = 125 – 11C = 9

0B60:0109 B8004C MOV AX,4C00

0B60:010C CD21 INT 21

0B60:010E 0000 ADD [BX+SI],AL

-d 100

0B60:0100 B8 10 01 BB 25 01 B9 09-00 B8 00 4C CD 21 00 00 ....%......L.!..

0B60:0110 68 65 6C 6C 6F 2C 20 77-6F 72 6C 64 31 32 33 34 hello, world1234

0B60:0120 35 36 37 38 39 67 6F 6F-64 62 79 65 2C 20 77 6F 56789goodbye, wo

0B60:0130 72 6C 64 01 00 EB 0D 31-C0 EB 09 83 7E 08 10 75 rld....1....~..u

Page 45: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming45

Dr. Martin LandHadassah CollegeSpring 2011

start_segment

Stack

Code

stored partof Data

header

load module

PSPDS:0000

CS:IP

SS:SP

File on Disk File in RAM

Addresses

Load

Load ModuleData+Code+Stack stored in *.exe program file on diskCopied to RAM at logical address start_segment:0000 (after 100h bytes of PSP)

HeaderParameters used to determine program addresses (ISS, SP, ICS, IP, others)N_code (physical byte offset) → ICS:IP (logical offset)N_stack (physical byte offset) → ISS:SP (logical offset)

DOS .exe Program — 1

Increasing

DOS

Data Segment

Stack

Code

stored partof DataN_code

N_stack

Page 46: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming46

Dr. Martin LandHadassah CollegeSpring 2011

SS

CS

stored partof DS

header

File on Disk

Addresses

Load

Parameters from header used to set CS and SSICS (initial code segment) = paragraphs to code segment from start of load module

DOS sets CS ← start_segment + ICS

= paragraphs to code segment from start of RAMISS (initial stack segment) = paragraphs to stack segment from start of load module

DOS sets SS ← start_segment + ISS

= paragraphs to stack segment from start of RAM

DOS .exe Program — 2

Increasing

Data Segment

start_segment

ICS:IP

ISS:SP

load module

PSP

File in RAM

DOS

Stack

Code

stored partof Data

SS:SP

CS:IP

Page 47: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming47

Dr. Martin LandHadassah CollegeSpring 2011

Simplest Segmentation ModelDefine non-overlapping segments for data, code, stackExample

DS = 1000, CS = 2000, SS = 3000Data in addresses DS:0000 — DS:FFFF → 10000 — 1FFFFCode in addresses CS:0000 — CS:FFFF → 20000 — 2FFFFStack in addresses SS:0000 — SS:FFFF → 30000 — 3FFFF

Very inefficientFull segment = 64 KBSmall program in 64 KB segment wastes spaceExample

DS = 1000CS = 2000Data segment = 32 bytes

Addresses 10000 to 1001F Wastes memory from 10020 to 1FFFF

stack

code

DS

SS

CS

data

Page 48: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming48

Dr. Martin LandHadassah CollegeSpring 2011

physical load address = 10000hstart_segment = 10000h / 10h = 1000h

data0108h bytes

code0208h bytes

stack0300h bytes

10000h + 0108h = 10108h

10000h + 0108h + 0208h = 10310h

PSP

Overlapping Segment Model — 1

Each program section immediately follows previous sectionPhysical address = start address + size of sections

Page 49: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming49

Dr. Martin LandHadassah CollegeSpring 2011

PSP100h bytes

physical load address = 10000hstart_segment = 1000h

data0108h bytes

code0208h bytes

stack0300h bytes

10108h

10310h

Overlapping Segment Model — 2

PSP Logical Address DS:0000DS = int((10000h – 100h)/10h)

= 0FF0Logical Address of data = DS:0100

Code Logical Address CS:IPCS = int(10108 / 10h) = 1010IP = 10108 % 10h = 0008

Stack Logical Address SS:SPSS = int(10310 / 10h) = 1031SP = 10310 % 10h = 0000

Physical addresses → logical addresses

Page 50: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming50

Dr. Martin LandHadassah CollegeSpring 2011

Linked *.exe FileAssemble: main.asm → main.objAssemble: function.asm → function.objLink: main.obj + function.obj → program.exe

b4 = 10h – (b1 + b2 + b3) % 10h

200hHeader

Padding

0b1Main Data

b1b2Main Code

b1 + b2b3Function Code

b1 + b2 + b3 + b4b5Stack

Offset (bytes) to Section from Start of MainSize (bytes)Section

Page 51: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming51

Dr. Martin LandHadassah CollegeSpring 2011

Overlapping Segment Example — on Disk

Zeros b4 = 10 – (b1 + b2 + b3) % 10Padding

Stores ICS,IP,ISS,SPPointer for Fn_CS

b0Program HeaderHeader

b1Stored DataData

ICS = b1 / 10IP = b1 % 10

b2

main: MOV AX,BXADD AX,[0012]CALL Fn_CS:Fn_IP

end: RET

Main Code

Fn_CS = (b1 + b2)/10Fn_IP = (b1 + b2) % 10

b3

function: MOV CX,20up: MUL CX

LOOP upRET

Function Code

ISS = (b1 + b2 + b3 + b4)/10SP = 0

b5Stored Stack ValuesStack

Segment PointerSizeContentsSection

DOS program in *.exe file on disk

Page 52: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming52

Dr. Martin LandHadassah CollegeSpring 2011

Overlapping Segment Example — RAM

b4

DS = s_seg – 10h100hDOS DataPSP

ZerosPadding

s_seg = PAstart / 10hb1Stored DataData

CS = s_seg + ICSIP

b2

main: MOV AX,BXADD AX,[0012]CALL Fn_CS:Fn_IP

end: RET

Main Code

Fn_CS ← s_seg + Fn_CSFn_IP

b3

function: MOV CX,20up: MUL CX

LOOP upRET

Function Code

SS = s_seg + ISSSP = 0

b5Stack ValuesStack

Physical AddressSize in bytesContentsSection

DOS program in main memory (RAM)Physical load address PAstart determined by DOSs_seg = start_segment = PAstart / 10h

Page 53: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming53

Dr. Martin LandHadassah CollegeSpring 2011

Numerical Example — Linked *.exe

10 – (0108 + 0052 + 0208)] % 10= 10 – (0362 % 10) = E

000E

Prefix only in memory—DOS DataPrefix

ZerosPadding

DS ← 1000 – 10 = 0FF0CS ← 1000 + 0010 = 1010

Fn_CS ← 1000 + 0015 = 1015SS ← 1000 + 0037 = 1037

200Program Header(ICS,IP,ISS,SP)

Header

s_seg = 1000 (load address 10000h)0108Stored DataData

ICS = 0108 / 10 = 0010IP = 0108 % 10 = 0008

0052main: MOV AX,BX

ADD AX,[0012]CALL Fn_CS:Fn_IP

end: RET

Main Code

Fn_CS = (0108 + 0052)/10 = (015A)/10 = 0015

Fn_IP = (015A) % 10 = 000A0208

function: MOV CX,20up: MUL CX

LOOP upRET

Function Code

ISS = (0362 + E)/10 = 0037SP = 0000

1000Stored Stack

ValuesStack

Segment PointerSize

(bytes)ContentsSection

Atloadtime

Page 54: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming54

Dr. Martin LandHadassah CollegeSpring 2011

Template for *.exe Programsection data ; declare initialized data here section bss ; declare uninitialized data here section text ..start: ; starting IP at next line MOV AX, data ; points DS at data segment MOV DS, AX ; ; put user code in this area ; MOV AX,4C00H INT 21H section stack stack ; declares stack segment named stack ; name is required for linker resb 2000h ; default 8 KB stack stacktop: ; points SP ay top of stack

Page 55: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming55

Dr. Martin LandHadassah CollegeSpring 2011

Section DeclarationsDefines and separates named sections

Usage depends on code typeUnix, Linux, and DOS *.com files

Standard section names are required .data, .bss, .text

Linked file begins with .text section (code)Data placed after end of code

DOS *.exe filesAny section names are allowedSection names have no special meaning

NASM changes .data → data

Linked file contains named sections in order of their definitionSections from separate sources

Combined if names are identicalNot combined if names are different

Page 56: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming56

Dr. Martin LandHadassah CollegeSpring 2011

Default Code

PSP

DATA(b bytes)

CODE

STACK

stored section data

Without Default CodeWith Default Code

DS

DS

CS:IP

SS:0000

SS:SP

SP

SS:SP = SS:0000

stacktop

..start:

MOV AX,dataMOV DS, AX

Sets IP = b % 10h

CS:IP = CS:0000CS = int(b / 10h)

Page 57: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming57

Dr. Martin LandHadassah CollegeSpring 2011

*.exe Example ⎯ 1ex.asm section data var1 db "ABCDEFGH" var2 dw 0x1234 var3 dw 0x0000 section text ..start: mov ax, data mov DS, ax mov di,var1 mov si,var2 call L1 mov ax,4c00h int 21h L1: lea bx,[di] mov ax,[si] mov [var3],ax ret section stack stack resb 64 stacktop:

Page 58: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming58

Dr. Martin LandHadassah CollegeSpring 2011

*.exe Example ⎯ 2

C:\nasm\programs\examples>nasm -f obj ex.asm NASM creates file ex.obj C:\nasm\programs\examples>link ex Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994 Copyright (C) Microsoft Corp 1984-1993. All rights reserved. Run File [ex.exe]: List File [nul.map]: Libraries [.lib]: Definitions File [nul.def]: LINK.EXE creates file ex.exe

Page 59: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming59

Dr. Martin LandHadassah CollegeSpring 2011

*.exe Example ⎯ 3C:\nasm\programs\examples>debug ex.exe -r AX=0000 BX=0000 CX=0024 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=0B76 ES=0B76 SS=0B89 CS=0B86 IP=000C NV UP EI PL NZ NA PO NC 0B86:000C B8860B MOV AX,0B86 -d ds:100 0B76:0100 41 42 43 44 45 46 47 48-34 12 00 00 B8 86 0B 8E ABCDEFGH4....... 0B76:0110 D8 BF 00 00 BE 08 00 E8-05 00 B8 00 4C CD 21 8D ............L.!. -u cs:0c l 20 0B86:000C B8860B MOV AX,0B86 ; data = DS + 10 = 0B76 + 10 0B86:000F 8ED8 MOV DS,AX 0B86:0011 BF0000 MOV DI,0000 ; var1 0B86:0014 BE0800 MOV SI,0008 ; var2 0B86:0017 E80500 CALL 001F 0B86:001A B8004C MOV AX,4C00 0B86:001D CD21 INT 21 0B86:001F 8D1D LEA BX,[DI] 0B86:0021 8B04 MOV AX,[SI] 0B86:0023 A30A00 MOV [000A],AX ; var3 0B86:0026 C3 RET 0B86:0027 E80A18 CALL 1834 0B86:002A EB18 JMP 0044

Page 60: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming60

Dr. Martin LandHadassah CollegeSpring 2011

Linking of Named Sectionssection data a1: dw 0x0011 section text ..start: mov ax,data ... call far Func mov ax,4c00h int 21h section data a2: dw 0x0033 section text Func: mov ax,a1

mov bx,a2 ret

-u 0000 1100 ADC [BX+SI],AX 0002 3300 XOR AX,[BX+SI] 0004 B8740B MOV AX,0B74 0007 9A1100740B CALL 0B74:0011 000C B8004C MOV AX,4C00 000F CD21 INT 21 0011 B80000 MOV AX,0000 0014 BB0200 MOV BX,0002 0017 C3 RET

section data_1 a1: dw 0x0011 section text_1 ..start: mov ax,data_1 ... call far Func mov ax,4c00h int 21h section data_2 a2: dw 0x0033 section text_2 Func: mov ax,data_2

mov bx,a2 ret

0000 1100 ADC [BX+SI],AX 0002 B8740B MOV AX,0B74 0005 9A0100750B CALL 0B75:0001 000A B8004C MOV AX,4C00 000D CD21 INT 21 000F 3300 XOR AX,[BX+SI] 0011 B8740B MOV AX,0B74 0014 BB0F00 MOV BX,000F 0017 C3 RET

Page 61: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming61

Dr. Martin LandHadassah CollegeSpring 2011

Far Call — 1section data ; global data section ; declare initialized variables here stdout dw 0 str_1 db "hello world",0dh,0ah,0 section bss ; declare uninitialized variables here section text ..start: MOV AX, data MOV DS, AX mov si, str_1 call far print_scr MOV AX,4C00H INT 21H

section text print_scr: mov ah,02h next: lodsb cmp al,0 jnz cout retf cout: mov dl,al int 21h jmp next section stack stack times 32 db 0 stacktop: C:\nasm\programs\examples>nasm -f obj ex5.asm

C:\nasm\programs\examples>link ex5

Page 62: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming62

Dr. Martin LandHadassah CollegeSpring 2011

Far Call ⎯ 2C:\nasm\programs\examples>debug ex5.exe -r AX=0000 BX=0000 CX=0050 DX=0000 SP=0020 BP=0000 SI=0000 DI=0000 DS=0B5F ES=0B5F SS=0B72 CS=0B70 IP=0000 NV UP EI PL NZ NA PO NC - 0B70:0000 B86F0B MOV AX,0B6F 0B70:0003 8ED8 MOV DS,AX 0B70:0005 BE0200 MOV SI,0002 0B70:0008 9A0200710B CALL 0B71:0002 → PA = 0B712 → 0B70:0012 0B70:000D B8004C MOV AX,4C00 0B70:0010 CD21 INT 21 0B70:0012 B402 MOV AH,02 0B70:0014 AC LODSB 0B70:0015 3C00 CMP AL,00 0B70:0017 7501 JNZ 001A 0B70:0019 CB RETF 0B70:001A 88C2 MOV DL,AL 0B70:001C CD21 INT 21 0B70:001E EBF4 JMP 0014 0B70:0020 0000 ADD [BX+SI],AL 0B70:0022 0000 ADD [BX+SI],AL 0B5F:0100 00 00 68 65 6C 6C 6F 20-77 6F 72 6C 64 0D 0A 00 ..hello world... 0B5F:0110 B8 6F 0B 8E D8 BE 02 00-9A 02 00 71 0B B8 00 4C .o.........q...L

Page 63: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming63

Dr. Martin LandHadassah CollegeSpring 2011

Separate Modules — 1ex6a.asm extern print_scr section data stdout dw 0 str_1 db "hello world",0dh,0ah,0 section bss section text ..start: MOV AX, data MOV DS, AX mov si, str_1 call far print_scr MOV AX,4C00H INT 21H

ex6b.asm section text global print_scr print_scr: mov ah,02h next: lodsb cmp al,0 jnz cout retf cout: mov dl,al int 21h jmp next section stack stack resb 0020H stacktop:

Page 64: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming64

Dr. Martin LandHadassah CollegeSpring 2011

Separate Modules — 2

C:\nasm\programs\examples>nasm -f obj ex6a.asm C:\nasm\programs\examples>nasm -f obj ex6b.asm C:\nasm\programs\examples>link ex6a ex6b Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994 Copyright (C) Microsoft Corp 1984-1993. All rights reserved. Run File [ex6a.exe]: ex6.exe List File [nul.map]: Libraries [.lib]: Definitions File [nul.def]:

Page 65: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming65

Dr. Martin LandHadassah CollegeSpring 2011

Separate Modules — 3C:\nasm\programs\examples>debug ex6.exe -r AX=0000 BX=0000 CX=0030 DX=0000 SP=0020 BP=0000 SI=0000 DI=0000 DS=0B5F ES=0B5F SS=0B72 CS=0B70 IP=0000 NV UP EI PL NZ NA PO NC - 0B70:0000 B86F0B MOV AX,0B6F ; DS ← data = start_seg = PSP + 10h 0B70:0003 8ED8 MOV DS,AX 0B70:0005 BE0200 MOV SI,0002 0B70:0008 9A0200710B CALL 0B71:0002 → PA = 0B712 → 0B70:0012 0B70:000D B8004C MOV AX,4C00 0B70:0010 CD21 INT 21 0B70:0012 B402 MOV AH,02 0B70:0014 AC LODSB 0B70:0015 3C00 CMP AL,00 0B70:0017 7501 JNZ 001A 0B70:0019 CB RETF 0B70:001A 88C2 MOV DL,AL 0B70:001C CD21 INT 21 0B70:001E EBF4 JMP 0014 -u 0B70:0020 0000 ADD [BX+SI],AL 0B70:0022 0000 ADD [BX+SI],AL 0B5F:0100 00 00 68 65 6C 6C 6F 20-77 6F 72 6C 64 0D 0A 00 ..hello world... 0B5F:0110 B8 6F 0B 8E D8 BE 02 00-9A 02 00 71 0B B8 00 4C .o.........q...L

Page 66: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming66

Dr. Martin LandHadassah CollegeSpring 2011

ex6.exe File ContentsC:\nasm\programs\examples>dump ex6.exe

StackISS = 3h

0230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

TextICS = 1h

0210 B8 00 00 8E D8 BE 02 00 9A 02 00 02 00 B8 00 4C0220 CD 21 B4 02 AC 3C 00 75 01 CB 88 C2 CD 21 EB F4

Data0200 00 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 0D 0A 00

Header

0000 4D 5A 50 00 02 00 02 00 20 00 00 00 FF FF 03 000010 20 00 00 00 00 00 01 00 1E 00 00 00 01 00 01 000020 01 00 0B 00 01 00 00 00 00 00 00 00 00 00 00 000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

...01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0001C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0001D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0001F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Page 67: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming67

Dr. Martin LandHadassah CollegeSpring 2011

ex6.exe Disassembly00000010 B80000 mov ax,0x0 ; start_seg = 000000013 8ED8 mov ds,ax00000015 BE0200 mov si,0x200000018 9A02000200 call 0x2:0x2 ; FnCS = 0x20000001D B8004C mov ax,0x4c0000000020 CD21 int 0x2100000022 B402 mov ah,0x200000024 AC lodsb00000025 3C00 cmp al,0x000000027 7501 jnz 0x1a00000029 CB retf0000002A 88C2 mov dl,al0000002C CD21 int 0x210000002E EBF4 jmp short 0x1400000030 0000 add [bx+si],al00000032 0000 add [bx+si],al

Page 68: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming68

Dr. Martin LandHadassah CollegeSpring 2011

*.exe Program Relocation ⎯ 1Offset registers set at load time

SP ← value stored in headerIP ← value stored in header

Segment registers set at load timeES = DS ← start_segment – 10 (point at PSP)CS ← start_segment + ICSSS ← start_segment + ISS

Relocation items: FAR BRANCH addresses adjustedTarget for branch instruction stored in data, code, or stack sectionExample

CALL Fn_CS:Fn_IPStored value Fn_CS = paragraphs to Fn from start of load moduleFn_CS ← start_segment + Fn_CS Adjusted Fn_CS = paragraphs to Fn from start of RAM

Page 69: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming69

Dr. Martin LandHadassah CollegeSpring 2011

*.exe Program Relocation ⎯ 2

Fn_CS = s_seg + IFn_CS = 0B6F + 0002 = 0B71

DefaultData

Segment

Header

DefaultCode

Segment

Stack

FarCode

CALL 0002:0002

IFn_CS = 0002IP = 0002

DOS+PSPs_seg = 0B6F

Program File Program in RAM

DefaultData

Segment

DefaultCode

Segment

Stack

FarCode

00022bytes

00022bytes

start ofmemory

LoadModule

FAR segment addresses in *.exe file — relative to start of load moduleAt load time, Relocation Items adjusted

FAR SEG ← start segment + FAR SEG

Page 70: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming70

Dr. Martin LandHadassah CollegeSpring 2011

*.exe Program HeaderOffset Contents

00h - 01h 4D 5A h — signature for a valid *.exe file. ASCII code for M and Z Mark Zbikowski was a designer of DOS at Microsoft

02h - 03h (Size of file including header) % (512) 04h - 05h Int [(Size of file including header) / (512)] + 1 06h - 07h Number of relocation table items following header 08h - 09h Size of header in 16 byte increments (paragraphs) 0Ah - 0Bh Minimum number of 16 byte paragraphs required by program 0Ch - 0Dh Maximum number of 16 byte paragraphs required 0Eh - 0Fh ISS — paragraphs from start of load module to stack segment 10h - 11h Starting SP 12h - 13h Word Checksum - negative sum of words in file ignoring overflow 14h - 15h Starting IP 16h - 17h ICS — paragraphs from start of load module to code segment 18h - 19h Displacement (bytes) of first relocation vector in file 1Ah - 1Bh Overlay number (0 for main resident part of program)

Page 71: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming71

Dr. Martin LandHadassah CollegeSpring 2011

Program HeaderTop of Header 0000 4D 5A 50 00 02 00 02 00 20 00 00 00 FF FF 03 00 *MZ...... .......* 0010 20 00 00 00 00 00 01 00 1E 00 00 00 01 00 01 00 *..{)J...........* 0020 01 00 0B 00 01 00 00 00 00 00 00 00 00 00 00 00 *......U.......j.* 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 *................*

Offset Value Contents 00h - 01h 4D 5A 4D 5A h 02h - 03h 50 00 Length of image mod 512 = 0050h

04h - 05h 02 00 Size of file in 512 byte pages (including remainder) = 0002h (1 × 200 + 50 = 0250 = 59210 bytes)

06h - 07h 02 00 Number of relocation table items following header = 0002 08h - 09h 20 00 Size of the header in 16 byte increments (paragraphs) = 0020 0Ah - 0Bh 00 00 Minimum number of 16 byte paragraphs required by program = 008B 0Ch - 0Dh FF FF Maximum number of 16 byte paragraphs required 0Eh - 0Fh 03 00 ISS = 0003 10h - 11h 20 00 SP = 0020 12h - 13h 00 00 Word Checksum – minus (sum of all words in file modulo 10000h) 14h - 15h 00 00 IP = 0000 16h - 17h 01 00 ICS = 0001 18h - 19h 1E 00 Displacement in bytes of first relocation vector in file = 001E Relocation Vectors

0001:0001 —> 0010 + 0001 = 0011 0001:000B —> 0010 + 000B = 001B

Page 72: 1 Assembly Language Programming Microprocessorscs.hadassah.ac.il/staff/martin/micro/slide05-1.pdf · 1 Assembly Language Programming Microprocessors Spring 2011 Hadassah College Dr

MicroprocessorsAssembly Language Programming72

Dr. Martin LandHadassah CollegeSpring 2011

Program Header Example ⎯ Relocation

Relocation vectors

start_segment = 0B5F + 10 = 0B6FCS = 0B6F + 0001 = 0B70 SS = 0B6F + 0003 = 0B72

C:\nasm\programs\examples>debug ex6.exe-rAX=0000 BX=0000 CX=0030 DX=0000 SP=0020 BP=0000 SI=0000 DI=0000DS=0B5F ES=0B5F SS=0B72 CS=0B70 IP=0000 NV UP EI PL NZ NA PO NC

0B6F + 0000 = 0B6F 0B6F + 0002 = 0B71Relocation

0001:0001 —> 0010 + 0001 = 00110001:000B —> 0010 + 000B = 001B

Byte displacement in load module

0BA6:0010 B8 6F 0B 8E D8 BE 02 00 9A 02 00 71 0B B8 00 4CLoad module in memory

0010 B8 00 00 8E D8 BE 02 00 9A 02 00 02 00 B8 00 4CLoad module in file ex6.exe

Segment registers

0011

001B