Using the Assembler
-
Upload
alexa-armstrong -
Category
Documents
-
view
56 -
download
3
description
Transcript of Using the Assembler
![Page 1: Using the Assembler](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/1.jpg)
1
Using the Assembler
Chapter – 4(A)
![Page 2: Using the Assembler](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/2.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/3.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/4.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/5.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/6.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/7.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/8.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/9.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/10.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/11.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/12.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/13.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/14.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/15.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/16.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/17.jpg)
17
JMP Example
Label1: . . jmp Label1
Unconditional Transfer of control to a label:
![Page 18: Using the Assembler](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/18.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/19.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/20.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/21.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/22.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/23.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/24.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/25.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/26.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/27.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/28.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/29.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/30.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/31.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/32.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/33.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/34.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/35.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/36.jpg)
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](https://reader036.fdocuments.net/reader036/viewer/2022062308/5681332e550346895d9a2c92/html5/thumbnails/37.jpg)
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