37
1 Using the Assembler Chapter – 4(A)

Using the Assembler

Embed Size (px)

DESCRIPTION

Using the Assembler. Chapter – 4(A). Exchanging Two Variables. title Exchange Two Variables     (Exchange.asm) .model small .stack 100h .data value1 db 0Ah value2 db 14h .code main proc     mov  ax,@data      ; initialize DS register     mov  ds,ax - PowerPoint PPT Presentation

Citation preview

Page 1: Using the Assembler

1

Using the Assembler

Chapter – 4(A)

Page 2: Using the Assembler

2

Exchanging Two Variables

title Exchange Two Variables     (Exchange.asm).model small.stack 100h.datavalue1 db 0Ahvalue2 db 14h.codemain proc    mov  ax,@data      ; initialize DS register    mov  ds,ax    mov  al,value1     ; load the AL register    xchg value2,al     ; exchange AL and value2    mov  value1,al     ; store new value of AL 

    mov  ax,4C00h      ; exit program    int  21hmain endpend main

Page 3: Using the Assembler

3

Exchange Two Variables            (Exchange.asm)

0000 .model small0000 .stack 100h

0000 .code0000 main proc0000  B8 ---- R mov   ax,@data ; initialize DS register0003  8E D8 mov   ds,ax0005  A0 0000 R mov   al,value1 ; load the AL register0008  86 06 0001 R xchg  al,value2 ; exchange AL and value2000C  A2 0000 R mov   value1,al ; store new value of AL000F  B8 4C00 mov   ax,4C00h ; return to DOS0012  CD 21 int   21h0014 main endp

0014 .data0000  0A value1  db 0Ah0001  14 value2  db 14h

end main

Source Listing File

Page 4: Using the Assembler

4

Map File

Start Stop Length Name Class00000H   00012H  00013H  _TEXT CODE00014H   00015H  00002H    _DATA      DATA00020H   0011FH  00100H    STACK      STACK

Program entry point at 0000:0000

Page 5: Using the Assembler

5

(64K)

(64K)

(64K)stack

data

code00 20 30 130

Offset

Overlapping Segments

Start Stop Length Name Class00000 00010 00011 _TEXT CODE00020 0002F 00010 _DATA DATA00030 0012F 00100 STACK STACK

Program entry point at 0000:0000

Page 6: Using the Assembler

6

Model Description

Tiny Code and data combined must be less than 64K.

SmallCode <= 64K, data <= 64K. One code segment,one data segment.

MediumData <= 64K, code any size. Multiple codesegments, one data segment.

CompactCode <= 64K, data any size. One code segment,multiple data segments.

LargeCode >64K, data > 64K. Multiple code and datasegments.

HugeSame as the Large model, except that individualvariables such as arrays may be larger than 64K.

FlatNo segments. 32-bit addresses are used for bothcode and data. Protected mode only.

Memory Models

Page 7: Using the Assembler

7

Directive Description

.8086Enables assembly of 8086 and 8088 instructions. Disablesassembly of instructions for the 80186 and later processors.Also enables 8087 instructions.

.186Enables assembly of 80186 instructions and disablesassembly of instructions for all later processors.

.286Enables assembly of nonprivileged 80286 instructions anddisables assembly of instructions for all later processors.

.386Enables assembly of nonprivileged 80386 instructions anddisables assembly of instructions for all later processors.

.486Enables assembly of nonprivileged 80486 instructions anddisables assembly of instructions for the Pentium.

.586 Enables assembly of nonprivileged Pentium instructions.

.287Enables assembly of floating-point instructions for the 80287math coprocessor.

.387Enables assembly of floating-point instructions for the 80387math coprocessor.

Target Processor Directives

Page 8: Using the Assembler

8

OFFSET Directives

OFFSET returns the 16-bit address (offset) of a label.

.data ;say variable “bytes” located at offset 0000bytes db 10h,20h,30h,40hwords dw 1000h,2000h,3000h

.codemov di,offset bytes ;DI =mov ax, offset bytes +1 ;AX =mov si, offset words +2 ;SI =

0000

00010006

Page 9: Using the Assembler

9

PTR DirectivesPTR is used to:1-overrides the default size of an operand.2- make clear the operand size.

.dataval32 dd 12345678h.codemov ax, val32 ;get low word (error) mov bx, val32+2 ;get high word (error)

mov ax, word ptr val32 ;AX = 5678h mov bx, word ptr val32+2 ;BX = 1234h

Page 10: Using the Assembler

10

PTR Directives

PTR is used to:

1-overrides the default size of an operand..2-To make clear the operand size.

Inc [bx] ;operand must have ;size (error message)

inc byte ptr [bx] ;operand size made ;clear

Page 11: Using the Assembler

11

.datamyByte db 1,2,3,4myWord dw 1000h,2000h,3000hmyDouble dd 12345678h

.codemov ax,TYPE myByte ; 1mov ax,TYPE myWord ; 2mov ax,TYPE myDouble ; 4

TYPEReturns the size, in bytes of a single element of a data name (variable)

Page 12: Using the Assembler

12

.datamyByte db 20 dup(?)myWord dw 5 dup(0)

.codemov ax,LENGTH myByte ; 20mov ax,LENGTH myWord ; 5

LENGTH

Returns a count of the number of individual elements in a data label that uses the DUP operator:

Page 13: Using the Assembler

13

.datamyByte db 20 dup(?)myWord dw 5 dup(0)

.codemov ax,SIZE myByte ; 20 (20 * 1)mov ax,SIZE myWord ; 10 (5 * 2)

SIZE

Returns TYPE multiplied by LENGTH:

Page 14: Using the Assembler

14

Operator Level Description

( ) 1 Parentheses

+, - 2 Positive and negative signs

*, /,MOD 3 Multiplication, Division

+, - 4 Addition, Subtraction

Operator Precedence Table

Property of associativity also applies

Page 15: Using the Assembler

15

JMP and LOOP Instructions

• JMP is an unconditional jump to a code label

• LOOP creates a counting loop, using CX as the default counter

Page 16: Using the Assembler

16

JMP: Distance Modifiers

– JMP SHORT destination• Jump within -128 to +127 bytes (an 8-bit value is

added to IP)– JMP NEAR PTR destination

• Jump within same code segment.• 16-bit offset is moved to IP)

– JMP FAR PTR destination• Jump to a different code code segment.• Segment address moves to CS and Offset to IP.

Page 17: Using the Assembler

17

JMP Example

Label1: . . jmp Label1

Unconditional Transfer of control to a label:

Page 18: Using the Assembler

18

JMP Example.model small.stack 100h.data.codemain proc

mov ax,@datamov ds,ax

start: mov ah,2mov dl,"A"int 21hjmp startmov ax,4c00hint 21h

main endpend main

Page 19: Using the Assembler

19

LOOP Instruction

• Automatically uses CX as the counter– decrements it automatically

• If CX > 0, LOOP transfers control to a label– otherwise, execution drops through

Page 20: Using the Assembler

20

mov cx,3 ; loop counter mov bx,1 ; value to be added mov ax,0 ; holds the sumL1: add ax,bx inc bx Loop L1

LOOP Example

AX= BX= CX=0000

Page 21: Using the Assembler

21

.model small

.stack 100h

.data

.codemain proc

mov ax,@datamov ds,axmov cx,26mov dl,41h

NextChar: mov ah,02hint 21hinc dl

loop NextCharmov ax,4c00hint 21h

main endpend main

LOOP Example

inc cx

mov cx, 0h

Page 22: Using the Assembler

22

Indirect Addressing

• Indirect Operands

An indirect operand is a register that contains the offset of a data in memory.

In 16 bit registers, SI, DI, BX and BP can be used as indirect operands.

Any 32 bit general purpose register can be used as indirect oprand (provided .386 or higher directive is used).

Page 23: Using the Assembler

23

Indirect Addressing• Indirect Operands

[si], [di], [bx], [bp]

• Based and Indexed Operandsarray[si], array[di], array[bx]

• Base-Index Operands[bx+si], [bx+di]

• Base-Index with Displacementarray[bx+si], array[bx+di]

Page 24: Using the Assembler

24

A B C D E F G ...........0200 0205

aString [bx]

Indirect Operand Example

.data

aString db "ABCDEFG“

.code

mov bx,offset aString

add bx,5

mov dl,[bx]

Page 25: Using the Assembler

25

.dataaList db 10h,20h,30hsum   db 0.codemov bx,offset aList   mov al,[bx] ; AL = 10hinc bxadd al,[bx] ; AL = 30hinc bxadd al,[bx] ; AL = 60hmov si,offset sum ; get offset of summov [si],al ; store the sum

Adding 8-bit Integers

mov bx, offset aList mov al,[bx] add al,[bx+1] add al,[bx+2] mov [bx+3],al

Page 26: Using the Assembler

26

.datawordList dw 1000h,2000h,3000h.codemov bx,offset wordListmov ax,[bx] ; first numberadd ax,[bx+2] ; second numberadd ax,[bx+4] ; third numbermov [bx+6],ax ; store the sum

1000 2000 C3000 (sum)

[bx] [bx+2] [bx+4] [bx+6]

Adding 16-bit Integers

Page 27: Using the Assembler

27

Segments Defaults

The offsets created by an operand is assumed to be from Data Segment, except when BP or EBP is part of an indirect operand.

e.g.,

mov si, bp ; both SI and BP become equal

mov dl,[si] ; looks for memory operand in Data Segment

mov dl,[bp] ; looks for memory operand in Stack Segment

Page 28: Using the Assembler

28

Overriding the default Segments

You can override the default segments also:

mov al, cs:[si] ;offset from CS

mov eax, es:[edi] ;offset from ES

mov bx, fs:[edx] ;offset from FS

mov dl, ss:[di] ;offset from SS

mov ax, gs:[ecx] ;offset from GS

mov dl, ds:[bp] ;offset from DS

Page 29: Using the Assembler

29

.datastring db "This is a string."COUNT = ($–string)  .code mov   cx,COUNT mov   si,offset string L1:  mov   ah,2 mov   dl,[si] int   21h inc   si Loop  L1

Displaying a String

Page 30: Using the Assembler

30

.dataabc dw 0100h,0200h,0300h,0400hCOUNT = ($ – abc) / (TYPE abc)

.code mov   ax,0 mov   di,offset abc mov   cx,COUNTL1:  add   ax,[di] add   di,TYPE abc Loop  L1

Summing an Integer Array

Page 31: Using the Assembler

31

Based and Indexed Operands

The microsoft assembler permits the same address expression to be notated in various ways:

Register Added to anOffset

Register Added to aConstant

mov dx,array[bx] mov ax,[bx + ROWVAL]

mov dx,[di + array] mov dx,[bp+4]

mov dx,[array+si] mov dx,2[si]

Page 32: Using the Assembler

32

02 16 04 22 13 19 42 64 44 88

0200 0205

[BX]

................

array (BX = 0005)

Based and Indexed Operands

.dataROWSIZE = 5array  db  2h, 16h, 4h, 22h, 13h db 19h, 42h, 64h, 44h, 88h.codemov bx,ROWSIZEmov al,array[bx]     ; AL = 19h

Each row of this table contains five bytes. BX points to the beginning of the second row:

Page 33: Using the Assembler

33

10 20 30 40 50 60 70 80 90 A0

0150 0155

[BX]

B0 C0 D0 E0 F0

[BX + SI]

0157

Based-Index Operands

Add the value of a base register to an index register, producing an effective address of 0157:

BX = 0155, SI = 0002

Example...

Page 34: Using the Assembler

34

.dataROWSIZE = 5array  db  10h, 20h, 30h, 40h, 50h db 60h, 70h, 80h, 90h,0A0h       db 0B0h,0C0h,0D0h,0E0h,0F0h

.codemov  bx,offset array ; point to the array at 0150add  bx,ROWSIZE ; choose second rowmov  si,2 ; choose third columnmov  al,[bx + si] ; get the value at 0157

Base-Index Example

10 20 30 40 50 60 70 80 90 A0

0150 0155

[BX]

B0 C0 D0 E0 F0

[BX + SI]

0157

Page 35: Using the Assembler

35

There is one important restriction in using Base-Idexed addressing i.e., you cannot combine two base registers or two index registers.Following statements are invalid:

mov al,[bp+bx]

mov al,[si+di]

Base-Index Restriction

Page 36: Using the Assembler

36

10 20 30 40 50 60 70 80 90 A0

0150 0155

[BX]

B0 C0 D0 E0 F0

[BX + SI]

0157

Base-Index with Displacement

.data

ROWSIZE = 5array db  10h, 20h, 30h, 40h, 50h db 60h, 70h, 80h, 90h,0A0h      db 0B0h,0C0h,0D0h,0E0h,0F0h

.code

mov bx,ROWSIZE ; row 1

mov si,2 ; column 2

mov dl,array[bx + si] ; DL = 80h

Page 37: Using the Assembler

37

32-Bit Registers

.386

mov ax,[ebx+3]

mov dl,string[edx]

mov ecx,[esi]

mov ebx,[eax]

The .386 directive permits any of the following registers to be used as indirect operands: EAX, EBX, ECX, EDX, ESI, EDI, EBP