You are on page 1of 169

Assembly Language Programming and Microprocessors

:
Intel
3833

4
4
3
08




Debug

41
40
42
44
44
44
43
43

16
01
04
32
32
32
28
23
24

:


CMP


IF.Then .End_If
If.ThenElseEnd_If
Case

FOR
While
Repeat

53
44
44
41
42
43
43
43
44
18
13
12
14
14
14

:

TEST





71
20
22
24
22
24
38
30
33
33

:


Procedures


CALL RET

85
34
31
32
33
34
34
40

94
44
42
44
44
083
084
084

:

DUP







PTR LABEL

108
083
084
084
084
008
008
008
008
002
004
002
002



XLAT

038
033
032
034

:


REP



128
033
034
034
028
023
022
024
022

:
:
:
:
:
:
:

140
048
040
042
044
041
043

Personal ComputersIntel
.
Assembly Language Programming and Organization of The IBM PCA
?CAC

Background

C
.
CAC
Structured Programming Language
.
A
.

C.
A C
.
A.
C
.



.
.
:
:Intel
8088
.
:C
?
..
: Flag Register
.
:A
High Level Language
AC. A
C
:A
A.?
?.
:Stack

: A
. ?A
.
: A
.
:A.Strings

A?
Low-Level
A A
..Systems Programming

:
IBM.Intel
8086?8086
C.Segments

Intel 8086
IBMIntel8086
8088802868038680486APentium?
8088?IBM PC
80286?) XT ( eXtended Technology? ( AT

) Advanced Technology.80386
A

ISA (Industry Standard

)Arch.) EISA ( Extended ISAA80386.80486


PentiumA
Bus Systems

LocalPCIVESA

.
AIntel

Software Compatibility
AC
. ?
Word LengthA.

00060000
Intel1978808616-

bits( 16-bit).19798088
8086
8-bits

8086

A?(
A
.)MHz
IBM8088?PC

IBM

C?
808616-bit ?
16-bit.
80868088A
A
80868088
A.

8018680188
801868018880868088
C
Chips

.SupportC

.Extended Instruction
C80286
.

80286-:
802861982Bits

16A

8086C12.5 MHZ10 MHZ


.808680286-:
1- Two Modes Of Operations
80286Real Mode
.Protected Mode
802868086
8086A.
AAA
Multi_Tasking @

.
2--:
80286C16 MByte
(1 MBYTE8086).
3--:

1 GBYTE(AA

16

MBYTE).

80386-:
1985CA32 BITS80386
A80286(16_BITC)32_BIT
C40 MHZ
A.80286
80386
80386.80286C
8086(VIRTUAL 8086 MODE)
A8086.

80386 CGbytes

C.64 T BYTES
80386SX

80386BITS

16.

80486-:
19898048680386
80386
80387
A
8038680387
Math. Co_Processor80386C
Cache Memory(
).8 Kbytes
80486A80386
.CA80486()C
.100 M Hz
A80486SX80486A
.C80486
.

Pentium
Pentium@CIntelA

64

BitsC80486C
.Cache Memory
CPentiumC
CCCMMXA.


00000006
?
?
.
A.Pentium

C:
:C?.
:.
:A.
14 ?A?.
DX,CX,BX,AX

.AACA
A()
.
.
A16-BITSA
8-BITSCHIGH LOW
AX16-BITSA(HIGH) AH
8-BITS)(LOW

ALA8-BITS.

D,C,B88-BITSAA
.16-BITS
AGENERAL PURPOSE REGISTERS
ACA
?:


-1(Accumulator) AX
AX
.
?.A
CC??
C?.AXAA
.

-2(Base Register) BX
BX
??
.

-3(Count Register) CX
CX
..

-4(Data Register )DX

CS, DS, SS, ES


.
.
A808820C(Address Bus20C)
C220 = 1,048,576A.1 Mbytes
AA5:
0000 0000 0000 0000 0000
0000 0000 0000 0000 0001
0000 0000 0000 0000 0010
0000 0000 0000 0000 0011
0000 0000 0000 0000 0100

=
=
=
=
=

00000 h
00001 h
00002 h
00003 h
00004 h


A00000h@.FFFFFh
A20
16 (A
C64 Kbytes)
CSegments64 K Bytes?.

?216 = 64 Kbytes
Segment NumberA0000h.FFFFh
COffset
16 BytesA0000h.FFFFh

:
Segment : Offset

Logical AddressAABB:55665566
.AABB
16(CA
A) CC
AABB:5566:

+
B

2
0

)
<+16<B0116

LOCATIONS OF SEGMENTS

AA0000:0000A00000@
0000:FFFFA0FFFFA0001:0000A
000100001:FFFFA.1000F
.()1:

45

1001F

..

45

1000F

..

35

0FFFF

..

29

00020

76

00010

00000

54

0
(1)

()1AA16.16
.ParagraphA10h
.Paragraph Boundaries
A
.:

-:1256A:
-A1256

-1240

:
:<>16+
-AAXA

X1256>10h+<

1256A

X12560+

1256A

<

000A

1256:000A

?
AXA

X10h+><1240

1256A

X12400+

1256A

<

016A

1240:016A

AAC
1256A = 1256:000A = 1240:016A

A:

80FD2hC8FD2h
:<>16+ A
80FD2h

<

>10h+BFD2h

< 7500h


CC
Stack.
Code SegmentData Segment
Segment

StackC

.Segment

)Code Segment Register (CS

Extra

Segment Address

Code


;
)Code Segment Register (CS
Instruction Pointer.

)Data segment Register (DS


Data Segment Address
()
.DS
A.

)Stack Segment Register (SS


?(Last In First Out
(LIFO) A?
A

Stack Pointer

).(SP

)Extra Segment Register (ES


C
A( @
C
(ES).

)Index and Pointer Registers (SP, BP, SI, DI


?
C?.

)Stack Pointer (SP


.

)Base Pointer (BP

A
A.

)Source Index (SI


C(A
) ;
.

)Destination Index (DI


SIC
ES
A
.

)Instruction Pointer (IP

.AA
.
A Instruction Pointer
)(IPSegment

Code

.CS:IPC
C
.

Flags Register
(): .

(C A
@) .
A ?

Interrupt FlagA?


C(A)
.

Memory Organization
8088.1Mbyte
?1KByte
?Vector Table

Interrupt A?

BIOS;
?)ROM (READ ONLY MEMORY?
.
(.)VIDEO DISPLAY MEMORY

I/O PORTS
808864KB ?
. C
A?
.

-1 802868088=
-2 =
-3.DX,CX,BX,AX
-40A51:CD90=
-54A37B:
-AC.40FF
-C.123B

6-=

8088
A
B.
A.
AA.
A??
?A ?
.
C.

-:
Assembler
Assembler

.
AAA
.
AInstructionsAssemblerC
Assembler-DirectivesCAssembler
?.

COMMENT

)OPERAND(S

OPERATION

NAME

TABA)(SPACEA
.

NAME()?
.

Operation.

)Operation(s A
.( A ).

Comments.

CX , 5 ; initialize counter

Srart: MOV

StartMOVCX55
CXA5.
:
Proc

Main

(C?).Main
:

Name Field
?A?A?
C.
A31
. CA
.
A?:
start counter - @character sum_of_digits - $1000 done? -.test

A?:

two words

2abc

( ).

a45.ab

()Operation Field
OpCodeAC
Assembler
CSubAddMov
.
ACCPseudo-OpAssembler
?ProcProcedure


Operand Field

()AAA
A

NOP

INC CX
ADD Word1 , 2

CX
Word12


destination OperandCAA(
AA)A

Source

Operand.
AC.

Comment Field

AC A.
?";"A
A.
A
AAAA
A.
:
; move 0 to CX

MOV CX , 0

; CX counts terms, initialized to 0

MOV CX , 0

A:

AA
:
;
; Initialize Registers

MOV CX,0
MOV BX, 0

Program Data
A
AAA.

Numbers

01BAbA
Binary
01010111BA11100011b

DAdADecimal12341345d.234D

AAHAhA
Hexadecimal0abhA.56H(0
Aabab).

10011

10011b

6455

-456h

FFFFh

(A)

1,234

()

0ab

(hA)H

Characters
AASUDAN
CASCIIAssembler

A41h(A
)A.

VARIABLES

High Level Programming Languages.


A?
.
C.

)DB (Define Byte

) DW (Define Word
)DD (Define Double Word

)DQ (Define Quad Word

)DT (Define Ten Bytes

?DB .DW

:Byte Variables
:

Initial_Value

DB

Name

DB

Alpha

Alpha
4.
(=).

DB

Byte

0255
CNumbers

Unsigned-128+127

.Signed Numbers

Word Variables

AWordBytes

Two

initial_value

name DW

-2

DW

WRD

WRD(2)
=.
wordA065535(216 1)
C()Unsigned Numbers
32768(-215)32767(215 - 1)

().Signed Numbers

Arrays
AA
. A3Bytes
10h20h30h:
10h, 20h, 30h

DB

B_ARRAY

B_ARRAYC)10h)B_ARRAY + 1
CB_ARRAY + 2C.C
0200hB_ARRAY:

10h

20h
30h

0200h

()Symbol
B_ARRAY
B_ARRAY + 1
B_ARRAY + 2

0201h
0202h

1000h, 2000h, 3000h

DW

W_ARRAY

1000h2000h3000h.
) ( 1000hW_ARRAYW_ARRAY +2

W_ARRAY + 4.?
300h:

1000h
2000h
3000h

(Symbol)
W_ARRAY
W_ARRAY + 2
W_ARRAY + 4

0300h
0302h
0304h

A
Low ByteHigh Byte.
C:Word1 DW 1234h
34h()word112h(
).word1 + 1

Character Strings
AA
ASCII TableC
LettersABC
ABC
41h, 42h,43h

db
db

1 - Letters
2 Letters

0dh,0ah,Sudan$

msg

db

Capital Letters

Small

.Letters

A?
.) EQU (EQUate
:

EQU Constant

name

name.LF0Ah

0Ah

EQU

LF

LF0AhMOV AL , LF
.MOV AL,0AhAssemblerLFC
.0Ah

Type your Name


prompt

Prompt
Msg

EQU
DB

AEQU CAA
.

?
AByte1Byte2Word1Word2

1MOV
MOV A
AA()
A.
Destination , Source

MOV

SourceCDestination

AX , Word1

MOV

()Word1C.AX
AX.
AL, A

MOV

041h(AASCII).AL
MOV

()

()

-2XCHG()Exchange
XCHG A
().:
XCHG Destination, Source

:
XCHG AH, BL

AH, BL(AHBLBL.)AH

:
AXWORD1
XCHG AX, WORD1

XCHG

3-:ADD, SUB, INC, DEC, NEG

MOV
XCHG
MOV
Word1,Word2

:
AX , Word2

Mov

Word1 , AX

Mov

ADDSUBAA
AA-:
Destination, Source
Destination, Source

ADD
SUB


WORD1, AX

ADD

AXCWORD1
WORD1(AX)
AX, DX

SUB

DXAXAX(
ADX)

ADDSUB

AAA
ADD BYTE1, BYTE2C:
C ; AL, BYTE2

MOV

BYTE1, AL

ADD

ADD BL,55CBL.BL
AA
MOV AX ,BYTE1

BYTEAAX.2-BYTE
(AA()A)

ASEMBLER
MOV AH, A(AHA)
41hAHA
MOV AX ,A(AXA)

0041h.AX

INC (Increment) , DEC (Decrement) , NEG


A,DEC

INC AA1

:
Destination ; Destination = Destination +1

INC

DEC Destination ; Destination = Destination - 1

INC WORD11CWORD1
DEC WORD21.WORD2
A)NEG(NegateCC
CC
Complement2S:
NEG Destination

AA

:
; BX = -BX

NEG BX

; BYTE = -BYTE.

NEG BYTE

-:
?
High Level Programming LanguagesC.
CAAB.WORD
B=A
C@
CCC
MOV AX , A

AAX B

MOV B , AX

AA= 5 - AC
5AX
AX 5-A
A

AC

MOV AX , 5

SUB AX , A

MOV A , AX

NEG A
ADD A,5

AA=B-2*AC

MOV AX,B
SUB AX,A
SUB AX, A
MOV A,AX

-:
C
SEGMENT

CODE@

DATA SEGMENT
STACK SEGMENT
?ASSEMBLER
.

:MEMORY MODELS
A
C.
MODEL.:
MEMORY_MODEL

.MODEL

A
CSMALL
.
MODEL .:

SMALL

A?

MODEL

SMALL

MEDIUM

COMPACT

LARGE

AA
64k BYTE

HUGE

AAA
64k BYTE

:DATA SEGMENT
A
A@.
DATA.

.DATA
2

DW

WORD1

DW

WORD2

THIS IS A MESSAGE

DB

MSG

10011001B

EQU

MASK

:Stack Segment
?A?
. AA(
A?).
Stack Size.:
size.bytes
100h
.Stack 100h

C1KB.Assembler

:Code Segment

.Code Name

Name.?Small(
)Assembly?.

(C?)ProcedureA
?
Name Proc

? ;
Name ENDP

Name? AProcEndpC Pseudo_Ops

.CODE
MAIN PROC

?;
MAIN ENDP

? ;

AA.small
:
.MODEL SMALL
.STACK 100H
.DATA

;
.CODE
MAIN PROC

? ;
MAIN ENDP

?;
END MAIN

@ END?.

INPUT &OUTPUT INSTRUCTIONS

IN??COUT?C.
C
A

SERVICE ROUTINES
.

BIOS (BASIC

) INPUT /OUTPUT SYSTEM.DOSBIOS


?(ROM)
DOSA
BIOSCC/.
?BIOSADOS? INT (INTERRUPT

)?
INT INTERRUPT_NUMBER

?16h
?21h

INTBIOS

INT?DOS

21H(INT 21H)
?DOS
AHA
?.21H
?.
C.

1
2
9

()
?

:1
:1AH
:

ALASCII

A0NON CHARACHTER KEY

)F1-F10).
-:
AH, 01
21H

MOV
INT

C.A
ASCIIAL
.C
.CF1-F10
AL.21h

INTAL

.
-2:2.

:02.AH
ASCII.DL

:ASCII.AL

AH , 02H
? DL ,
21H

MOV
MOV
INT

C(C
C).
Control CharacterA
)
ASCII
7

)BEL (Beep

)BS (Back space

)HT (Tab

)LF (Line Feed

)CR (Carriage return

C
) Back Space)
Tab

ALASCII

:
?C
C?.
?:
- 1 C"="
AH,2
?DL,
21h

MOV
MOV
INT

AH,1
21h

MOV
INT

-2

-3

C@BLDL

CAL(A2
DLAL
)@BL
-4

BL , AL

MOV

Carriage ReturnLine Feed

-5

AH,2
DL,0dh ; Carriage Return
21h
DL,0ah ; Line Feed
21h

MOV
MOV
INT
MOV
INT

DL , BL
21h

MOV
INT

C(BL()3

-6

C?4ChAH

??.21h
AH,4CH
21h

MOV
INT

:
TITLE FIRST: ECHO PROGRAM
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
;

MOV AH,2

?MOV DL,
INT 21H

?;
? ;

MOV AH,01
INT 21H

MOV BL,AL

C ;
MOV AH,02
MOV DL,0DH ; carriage return
INT 21H
MOV DL,0AH ; line feed
INT 21H
C ;

C ; ;

MOV DL,BL
INT 21H

C ; DOS
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN

ADOSINT 21h4Ch

-:
?C?-:
-1

AText Editor.()

-2

ASSEMBLER.OBJECT FILE

-3

LINKEROBJECT
.EXECUTABLE FILE

-4

-:

-1-:SOURCE FILE

AEditorA
Text EditorEDIT)ASM (Extention
.FIRST.ASM

-2-:ASSEMBLE THE PROGRAM


AAssembler

MASM(Microsoft

)Macro AssemblerA)TASM(Turbo Assembler


CC).(OBJECT FILE
A?A
C)(1?A?
.
TASMAMASM:
;TASM FILENAME

A ;MASM FILENAME

?TASM?-:
COPYRGHT(C)1988,1992BRLAND

3.1

;>TASM FIRST
TURBO
ASSEMBLER
VERSION
INTERNATIONAL
ASSEMBLING FILE: FIRST.SAM
ERROR MESSAGE: NONE
WARNING MESSAGE:NONE
PASSES: 1

ASSEMBLER?
.
AC AC
first.asmA
C.first.obj

-3Linking the program


CBMachine Language
:
-A
.

-?A
A?A@.

Link Program?Files

Object

. EXE)(Executable File
:
;> TLINK First
Turbo Link Version 2.0 Copyright (c) 1987 Borland International.

4 Run The Program


DOS
C:\ASM > first
?t
t
> C:\ASM

"="C.
C?
C.

Display String

1?21h
2.
9
9

:OffsetDX

(A""$)
""$.CA
Control CharacterA?.
!Hello.

LEA

HELLO!$

db

msg

9?21h

INTCCDX

)LEA ( Load Effective Address


Destination , Source

LEA

A().
.
msg.DX

DX, MSG

LEA

CDSC
.

)PSP (Program Segment Prefix


256
.PSPPSP
.DOSDS
ES DS
AA
AC
MOV AX, @DATA
MOV DS, AX

@DATADATA.

ASSEMBLER@DATAC
DSAX
AC.DS
!HELLODX
9?.21h
TITLE SECOND: DISPLAY STRING
.MODEL SMALL
.STACK 100H
.DATA
'MSG DB 'HELLO!$
.CODE
MAIN PROC
; initialize DS
MOV AX,@DATA

MOV DS,AX
;display message
LEA DX,MSG
MOV AH,09H
INT 21H
;return to DOS
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN

;
;

:A Case Conversion Program


letter

lower-case

CC

upper-case

letter
Enter A Lower Case Letter: a
In Upper Case It Is: A

EQU CR,LF
0DH
0AH

EQU
EQU

Enter A Lower Case Letter:$


CR,LF, In Upper Case It Is:
? ,$

CR
LF

MSG1 DB
MSG2 DB
Char DB

charMSG2
msg2char( CC-case

Upper

20hC)
CR,LFmsg2A.
msg2$
char(A$char).
Amsg1?
DX ,msg1
AH ,9
21h
AH ,1
21h

Cupper-case

20h

LEA
MOV
INT
MOV
INT

ASCII 20hA?
41hA? )61hchar
;

AL,20h

SUB

MOV

char ,AL

.charmsg2
:
TITLE THIRD: CASE CONVERSION PROGRAM
.MODEL SMALL
.STACK 100H
.DATA
CR
EQU 0DH
LF
EQU 0AH
MSG1 DB
'ENTER A LOWER CASE LETTER: $'
MSG2 DB
CR,LF,'IN UPPER CASE IT IS:'
CHAR DB
?,'$'
.CODE
MAIN PROC
; initialize DS
MOV AX,@DATA
MOV DS,AX
;print user prompt
LEA DX,MSG1
MOV AH,09H
INT
21H
;input character and convert to lower case
MOV AH,01H
INT
21H
SUB AL,20H
MOV CHAR,AL
;display on the next line
LEA DX,MSG2
MOV AH,09H
INT
21H
;return to DOS
MOV AH,4CH
INT
21H
MAIN ENDP
END MAIN

-:
=...IBM PCA?A-1
1- two_words
2- ?1
3- tow words
4- t=

AC.AA-2
.
1- 246
5- 2EAH

2- 246h
6- FFEH

3- 1001
7-1011B

4- 1.101

)C(A-3
.52Aword-A

-wordword1.
-ByteB.52
-ByteC.
-wordword2.65536
-Array1
-Bell.7
-msgThis Is A Message $

-4 A?0000h
DB
7
1ABCH
HELLO

A-A.A,B,C

A
DW
DB

B
C

-.0002h
-.0004h
-O.HELLO
-5CAB1,B2Byte
w1,w2.words
2-MOV

Ds,1000h
w1,DS
5,B1

4-MOV
6-SUB

AL,256

8-ADD

Ds,Ax
CS,ES
w1,w2
B1,B2
w1,B1

1-MOV
3- MOV
5-XCHG
7-ADD
9-MOV

-6MOV, ADD , SUB ,INC , DEC , NEG


C:

-7():

1- A=B - A
)2- A= -(A+1
3- C= A + B
4- B= 3* B + 7
5- A= B - A- 1

-1?.
-2?Upper case letter
.Lower case letter
:
-8:

-1?.

-2?A10
-3.

? 35
The sum of 3 and 5 is 8

-9.?
.
Enter Three Letters: ABC
A
B
C

-10?A( )A-F
.
Enter A Hexadecimal Digit: C
In Decimal It Is: 12

AA
.8086@9
Flags .

Register

Flag C

Control Flags .Status Flags A


A? ACA
?.

0
246711 8910
( AA
) ?

Cf

Pf

Af

Zf

Sf

Tf

Of Df If

Status Flags

@AAx,Bx

SUB

1C.

Status Flags

Name

CF

Carry Flag

PF

Parity Flag

AF

Auxiliary Carry Flag

ZF

Zero Flag

SF

Sign Flag

OF

Overflow Flag

11

Control Flags
Trap Flag

TF

IF

Interrupt Flag

10

DF

Direction Flag

)Carry Flag (CF


1( )CAC
)Most Significant Bit (MSB.
.
AShiftRotate.

)Parity Flag (PF


1CLow Byte
.1C
1.C@FFFEh
FEH(11101111)
17() 0(PF = 0)

)Auxiliary Carry Flag (AF


1C ACbit-3
).Binary Coded Decimal (BCD

)Zero Flag (ZF


)1 (ZF=1C
)Sign Flag (SF
1CMSB1
A.(AASF = 1CMSB =1SF= 0C)MSB= 0
)Overflow Flag (OF

)1 (OF=1 C Signed

NumbersC.?
.
Overflow

C
(AByte

One255)

CAC?
.

(C)Unsigned Numbers
.Signed NumbersC?A
:

1-

2-

3-

4-

CAAXFFFFhA
BX1ADD AX, BX:

A
- 1

1111
0001
0000

1111
0000
0000

1111
0000
0000

1111
0000
0000

+
=1

CAAC65536A
10000h(AA

65535)10000hAX
.
- 2

ACAA FFFFh1
1C0()0
.

@C AAXBX
7FFFhADD AX,BX:

FFFEh

1111
1111
1110

1111
1111
1111

1111
1111
1111

0111
0111
1111

7FFFhACA
0(MSB = 0)32767)(7FFFh
A65534
A (-2)
C

OF=1C C
CCF=1
AA?
. C .
AC
AAC. A
C CF .OFAC
OF.

CA

Unsigned overflow
CC
MSBAAA(AA
AAFFFFhA16A
FFhA8).

A().
Signed Overflow
AAC
C. A
A
-A ( +B ) = -A -B

A(-B)=A+B

CC
AAA+-

)(BA-BA ABAA
A.A
.
:CC
MSB(AC
AC).
(A).

:
AA . A
CC .
AINSTRUCTIONS

JUMP

.
?
:

MOV / XCHG

ADD / SUB

INC / DEC

()CF

NEG

(CF=1CC0 0F=1C
800HWORDA80hByte)


operands 0f,sf,zf,pf,cf(
AFBCD).
:1

ADD AX,BXAXFFFFhBX

FFFFh

:
FFFFh

+FFFFh
1FFFEh
)1111 1111 1111 1110 (0FFFEhAX
:
SF:

1MSB1.

PF:07()1
LOW BYTE.
ZF:

0.

CF:

1 MSB
.

OF:

CC
(CMSBMSB).

2:
ADD AL,BLAL80hBL80h

:
80h
+80h
100h

AL00h
SF:

SF=0MSB0

:PF PF=101
ZF:

ZF=10

CF:

CF=1 CMSB

OF:

OF=1(C
MSB).

:3
SUB AX,BXCAX8000h
BX0001h
:
8000h
-0001h
7FFFh = 0111 1111 1111 1111

SF:

SF=0MSB=0(@)MSB

:PF PF=18()""1
ZF:

ZF=00

CF:

CF=0 CA

OF:

OF=1.
.A(C
).

:4
INC ALALFFh
:
FFh

1h

100h
100hAL.A


SF:

SF=0MSB=0

:PF PF=181
ZF:

ZF=1

CF:

INC.

OF:

OF=0C(C
MSB).

:5
MOV AX,-5
5()FFFBhAXA MOV.
:6
NEG AXAX8000h
8000h = 1000 0000 0000 0000

COMPLEMENT = 1000 0000 0000 0000


0000000000001000
SF:

SF=1

:PF PF=1
ZF:

ZF=0

CF:

CF=1CF<1CC
.

OF:

OF=1NEGC
.

DEBUG:
DEBUG_C
C

DEBUG
EXCUTABLE FILE
C:\DOS\DEBUG TEST.EXE

""- A
-:
.1R.AR
(.)R IP
.2T()TRACEC.
.3G(GO)C.
.4Q()QUITC.
.5A ASSEMBLE.
.6UB?.
.7D DUMBCC?.

Debug:

;ax = 4000h
;ax = 8000h
;ax = 8001h
;ax = 7fffh
;ax = 8000h

4000H
AX
0FFFFH
4CH

;DOS exit

MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AX ,
ADD AX ,
SUB AX ,
NEG AX
INC AX
MOV AH ,
INT 21H
MAIN ENDP
END MAIN

test.asmExecutable file
Test.exe?Debug:DOS
c:\asm> DEBUG TEST.EXE

C""-.
AR:

-R

AX=0000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000


DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0000 NV UP DI PL NZ NA PO NC
B80040 MOV AX , 4000

0EE6:0000

(-CS:IP)
Machine CodeB80040.
A
.
8ANV UP DI PL NZ NA PO NC
:

Set
)CF (CarryFlag
)PF (Parity Flag
)AF (Auxiliary Flag
)ZF (Zero Flag
)SF (Sign Flag
)OF (Overflow Flag

Clear

)CY (CarrY
)PE (Parity Even
)AC (Auxiliary Carry
)ZR (ZeRo
)NG (NeGative
)OV (OVerflow

)NC (No Carry


)PO (Parity Odd
)NA (No Auxiliary carry
)NZ (NonZero
)PL (Plus
)NV (No oVerflow

Control Flags
)DF (Direction Flag
) IF ( Interrupt Flag

)DN (DowN
)EI (Enable Interrupt

)UP (UP
)DI (Disable Interrupt

TATrace:
(

-R
AX=0000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000
DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0000 NV UP DI PL NZ NA PO NC

A:MOV AX , 4000h

B80040 MOV AX , 4000

0EE6:0000

-T

AX=4000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000

DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0003 NV UP DI PL NZ NA PO NC

4000hAX

ADD AX , AX

03C0

0EE6:0003

AAXA4000H AA
ADD AX,AX

-T

AX=8000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000

DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0005 OV UP DI NG NZ NA PE NC

0EE6:0005

AAXA8000H AA
2DFFFF SUB AX , FFFF
C CA

AX(A)AL1.
SUB AX,FFFFh

-T

AX=8001 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000

DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=0008 NV UP DI NG NZ AC PO CY

NEG AX

F7D8

0EE6:0008
-T

AX=7FFF BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000


DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=000A NV UP DI PL NZ AC PE CY
INC AX

40

0EE6:000A
-T

AX=8000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000

DS=0ED5 ES=0ED5 SS=0EE5 CS=EE6 IP=000B OV UP DI NG NZ AC PE CY

0EE6:000B

MOV AH , 4C

B44C

-G
PROGRAM TERMINATED NORMALLY
-Q
>\C:

:
REG

DESTINATION

.
ADD AX,BX .1AX7FFFhBX.0001h
.2

SUB AL,BAL=01hBL=FFh

.3

DEC ALAL=00h

.4

NEG ALAL=7F

XCHG AX,BX .5AX=1ABChBX=712h.


ADD AL,BL .6AL=80hBL=FFh.
SUB AX,BX .7AX=0000hBX=8000h.
NEG AX .8AX=0001h.

A-2BX AXA.ADD AX,BXA


CMSB.
ABX AXA.ADD AX,BXA
MSBC.

-3AAAX,BX

ADDCAX

BX.AX
AC.
.A512Ch
+4185h

FE12h .

.E1E4h

.7132h

.6389h

+ 1ACBh

+ DAB3h

+ 7000h

+ 1176h

-4AASUB AX,BXCAX
BX.AX
AC.
.A

.19BCh

2143h

.81Feh

-1986h

FE0Fh -81Feh -1986h

.0002h

71ABh

88CDh


Flow Control Instructions

A
ACA
Status Flags.
A HIGH LEVEL

LANGUAGE.

:
AA
ASCII Table.
.Model Small
.Stack 100h
.Code
PROC
AH , 2

MOV

CX , 256

MOV

DL , 0

MOV

MAIN

Print_Loop:

;DL

21h

INT

DL

INC

CX

DEC

; PRINT_LOOP

JNZ

CC

; DOS_EXIT
AH , 4Ch

MOV

21h

INT
ENDP

MAIN

MAIN

END

256IBM Character Set.


2(C)2 .AH
DL0
CX256CC.
(Jump if Not Zero) JNZ C)(Print-Loop
CC CXC ZF.

)(ZF= 0CAC)(ZF= 1C
.4CH

CONDITIONAL JUMP

JNZ. A
destination-Label

Jxxx

C
A.CC.
A126A127
CAA.

.A @
AA A C .
C IPAA.C
C.

JNZ PRINT-LOOP
AC ZF= 0C

PRINT-LOOP

.AC ) (ZF= 1C.


AC:
Signed Jumps Singed Numbers

C Unsigned JumpsC

Unsigned Numbers.

Single Flag Jumps .

A.AA JG JNLE
CA JGACAA.A
C.

-1Signed Jumps

JG / JNLE

A(AA)

JGE / JNL

AA(A)

SF=OF

JL / JNGE

A(AA)

SF<>OF

JLE / JNG

AA(A)

& SF=OF

ZF=0

ZF=1 OR SF<>OF

-2Unsigned Jumps

JA / JNBE

A(AA)

JAE / JNB

AA(A)

CF=0

JB / JNAE

A(AA)

CF=1

JBE / JNA

AA(A)

& ZF=0

OR ZF=1

CF=0

CF=1

-3Single Flag Jumps

JE / JZ

ZF=1

JNE / JNZ

()

ZF=0

JC

Carry

CF=1

JNC

Carry

CF=0

JO

OF=1

JNO

OF=0

JS

SF=1

JNS

SF=0

JP / JPE

PF=1

JNP / JPO

PF=0

CMP
)Compare(CMP:
Destination , SourceCMP

source destination
CMPA destination
A.
ACMPSUBA.
A:

Ax , Bx
Below

CMP
JG

AX=777Fh BX=0001h Ax,BxCMP:


7FFFh - 0001h = 7FFEh

A zf = sf = of =0JGA

Zf = 0 Sf = OfCBelow.
A C
:
AX,BX

CMP

Below

JG

CAXABXC
Below.
ACMPA
AA@:
DEC
JNZ

CX
loop

C C loop CX.

:
AACJGJAA
.AA
A zf , sf , of
C zf , cfC.

CAx 7fffh Bx
8000h:
AX,BX

CMP

Below

JA

A 7EFF > 8000hCBelow


7FFFh < 8000hJAC.
:
AC
0MSBC
Extended ASCII Code80h - FFh.
:
A AXBXA ?
.CX
CX , AX
BX , CX

MOV
CMP

NEXT

JLE
NEXT: MOV

CX,BX

Unconditional Jump
JMP CA:
Destination

Jmp


.
.
TOP:

; Loop Body
;

CX

Dec

TOP

JNZ

C TOP(A126)
JNZ JMP
A

TOP:

; Loop Body
CX

DEC

BOTTOM

JNZ

EXIT

JMP
BOTTOM:

TOP

JMP
EXIT:

AA ?
A

High Level Programming

Languages.

IF..Then.
If..Then
IF condition is True then
Execute True branch statements
End_IF

AC C?

AX.

AC().
IF AX < 0 then
Replace AX with AX
End_IF

AX , 0
END_IF

CMP
JNL

; Then
AX

NEG
END_IF:

2IFTHEN..ELSE..ENDIF

IF Condition is True then


Execute True_Branch statements
ELSE
Execute False_Branch statements
End_IF

CCA
-:
ABL,AL)(ASCII CODE ()

IF

AL < = BL THEN
DISPLAY

AL

ELSE
DISPLAY BL
END_IF

-:()
AH,2

MOV
CMP

AL,BL

JNBE

ELSE_

MOV

DL,AL

JMP

DISPLAY

MOV

DL,BL

INT

21H

ELSE_:

DISPLAY:

CASE-3

:AACASE
CASE

EXPRESSION
VALUE_1

VALUE_2

STATEMENT_1

STATEMENT_2

:
VALUE_N

STATEMENT_N

END_CASE

0AX BX 1AX C
.BX1AX CABX
:
CASE

AX
<0

PUT

IN BX

=0

PUT

IN BX

>0

PUT

IN BX

END_CASE

CMP AX, 0

; AX

JL

NEGATIVE

; AX < 0

JE

ZERO

; AX = 0

JG

POSITIVE

; AX > 0

; Otherwise (Else) part will be here


NEGATIVE :
MOV

BX,-1

JMP
ZERO

END_CASE

:
MOV

BX,0

JMP
POSITIVE

:
MOV BX,1

END_CASE

END_CASE:

ACMPA .
: C AL1A3A""0 C
AL2A4A.E
:
AL of

CASE

1,3:DISPLAY 0
2,4:DISPLAY E
END_CASE

AL , 1

CMP
ODD

JE

AL , 3

CMP

ODD

JE

AL , 2

CMP

EVEN

JE

AL , 4

CMP

EVEN

JE

END_CASE

JMP

DL , O

MOV

DISPLAY

JMP

DL , E

MOV

EVEN:

AH ,2

MOV

DISPLAY:

21H

INT

ODD:

END_CASE:

Compound Conditions


condition2

AND

condition1

A condition2

IF
OR

condition1

IF

""AND"A"OR
""AND Condition
""C@
: A CCapital Letter
:
Read a Character into AL
If ( A <= character AND character <= Z) then
Display character
End_IF

AH , 1

MOV

21h

INT

AL , A

CMP

JNGE End_IF
AL , Z

CMP

JNLE End_IF
DL , AL

MOV

AH , 2

MOV

21h

INT
End_IF:

""OR Condition

AAC"A"
?YAyCYAyCA :

Read character from keyboard into AL


IF ( character = y

OR

character = Y ) then

Display character
Else
Terminate the program
End_IF

MOV

AH , 1 ;

INT

21h

CMP

AL , y

JE

then

CMP

AL , Y

JE

Then

JMP

else_

Then: MOV

DL,AL

MOV

AH , 2

INT

21h

JMP

End_if

else: MOV
INT

AH ,4ch
21h

End_if:

.A
.

for loop
For loop_count times do
statements
End_for

loop
loop destination_label

CX()loop
CC CXCCX<C
(destination_labelA126A)
CXC?.
loop
) ; ( CX

top:
;
loop top

-:80"*"

for 80 times do
* display
End_for

CX , 80

MOV

AH , 2

MOV

* DL ,

MOV

21h

Top: INT

LOOP top

ALOOPC
CCX

16553565535

)(00FFFh

.
ACX
) JCXZ ( Jump if CX is Zero
skip

JCXZ
Top:
;
top

loop
skip:

WHILE

While Condition DO
Statements
End_while

C
.
AACC
.AAA
C?()
:?

A ; INITIALIZE COUNT TO 0
A ; READ A CHARACTER
CHARACTER<>CARRIAGE-RETURN DO

WHILE

COUNT =COUNT+1
READ A CHARACTER
END-WHILE

; DX,0

MOV

1(?)

AH , 1

MOV

21h

INT
WHILE:

AL,0DH

CMP

END_WHILE

JE

DX

INC

AC

21H

INT

WHILE.

JMP
:

END-WHILE

REPEAT

A .
REPEAT
; )STATEMENT(s
CONDITION

UNTIL

.AC
.
:?? blank

AH,1

MOV
REPEAT:

2!H
AL ,
REPAET

INT
CMP
JNE

WHILE REPEAT
WHILE
C REPEAT
A.


C:
A
A(.)ASCII
C) (No capital letters.:
TYPE A LINE OF TEXT :
SUDAN UNIVERSITEY OF SCIENCE AND TECHNOLOGY
FIRST CAPITAL = A LAST CAPITAL = Y

C
AC
PROGRAM DESIGN:

-1.

-2A.

-3.

.
-1
?
9

AH,9
DX ,PROMPT
21H

PROMPT

MOV
LEA
INT

TOP - DOWN

PROMPT DB TYPE A LINE OF TEXT : ,0DH,0AH, $

CCURSOR
:-2
?

Read Character;
While Character Is Not a Carriage Return Do
IF Character Is A Capital Letter Then
IF Character Precedes First Capital THEN
First Capital =CHARACTER
END_IF
IF Character Follows Last Capital THEN
Last Capital = Character
END_IF
END_IF
Read Character
END_WHILE

Character >= A AND Character <=Z C

MOV

AH , 1

INT

21H

CMP

AL,0DH

JE

END_WHILE

WHILE:

CMP

AL , A

JNGE END_IF
CMP

AL , Z

JNLE END_IF
CMP

AL,FIRST

JNL

CHECK-LAST

MOV

FIRST,AL

CHECK-LAST:
CMP

AL,LAST

JNG

END-IF

MOV

LAST,AL

END_IF:

INT

21H

JMP WHILE
END_WHILE

-:LASTFIRST
FIRST

DB

LAST

DB

A @Z ]

-:/3
:
IF NO CAPITAL LETTER TYPED THEN
DISPLAY NO CAPITAL
ELSE
DISPLAY FIRST & LAST CHARACTER
END_IF

AACC
:?.C
NOCAP-MSG

DB

NO CAPITALS $

CAP-MSG

DB

FIRST CAPITAL=

FIRST

DB

DB

LAST CAPITAL=

DB

LAST

?
MOV

AH ,

CMP

FIRST,]

JNE

CAPS

LEA

DX ,NOCAP_MSG

JMP

DISPLAY

LEA

DX, CAP_MSG

DISPLAY:

INT

21H

CAPS

TITLE THIRD: CASE CONVERSION PROGRAM


.MODEL SMALL
.STACK 100H
.DATA
CR

EQU

0DH

LF

EQU

0AH

PROMPT

DB

TYPE A LINE OF TEXT',CR,LF,'$'

NOCAP_MSG

DB

CR,LF,'NO CAPITALS $'

CAP_MSG

DB

CR,LF,'FIRST CAPITAL ='

FIRST

DB

']'

LAST

DB

' LAST CAPITAL = '

DB

'@

$'

.CODE
MAIN PROC
; initialize DS
MOV

AX,@DATA

MOV

DS,AX

;display opening message


LEA

DX,prompt

MOV

AH,09H

INT

21H

;read and process a line of text


MOV

AH,01H

INT

21H

CMP

AL,CR

JE

END_WHILE

WHILE_:

;if char is capital


CMP

AL,'A'

JNGE END_IF
CMP

AL,'Z'

JNLE END_IF
; if character precede first capital
CMP

AL,FIRST

JNL

CHECK_LAST

MOV

FIRST,AL

CHECK_LAST:
; if character follow last capital
CMP

AL,LAST

JNG

END_IF

MOV

LAST,AL

INT

21H

JMP

WHILE_

MOV

AH,9

END_IF:

END_WHILE:

;if no capital were typed


CMP

FIRST,']'

JNE

CAPS

LEA

DX,NOCAP_MSG

JMP

DISPLAY

LEA

DX,CAP_MSG

INT

21H

CAPS:

DISPLAY:

;exit to DOS
MOV

AH,4CH

INT

21H

MAIN

ENDP

END

MAIN


C-1
1-

IF

AX < 0 THEN
PUT -1 IN BX

END_IF
2-

IF

AL < 0

THEN

PUT FFh

IN AH

ELSE
PUT 0 IN AH
END_IF
3-

IF ( DL >= A

AND DL = < Z ) Then

DISPLAY

DL

END_IF
4-

IF

AX < BX THEN
IF

BX < CX THEN
PUT

0 IN AX

ELSE
PUT 0 IN BX
END_IF
END_IF
5-

IF ( AX < BX ) OR ( BX < CX ) THEN


PUT 0 IN DX
ELSE
PUT 1 IN DX
END_IF

IF AX < BX THEN

6-

PUT 0 IN AX
ELSE
THEN

IF BX < CX

PUT 0 IN BX
ELSE
PUT 0 IN CX
END_IF
END_IF

2-

CASE?
A.

A-

- CA()Carriage Return

- CB()Line Feed
CA@?.

3-

?:
1+4+7+........+148.AX

A-

- 100+95+90+......+5.BX

4-

LOOP:
A501 5 9 13AX

A-

- ?80.

5-

INITIALIZE QUOTIENT TO 0
WHILE DIVIDENT > = DIVISOR DO
INCREMENT QUOTIENT
SUBTRACT DIVISOR FROM DIVIDEND
END_WHILE

?AX

BXCX

6-

NM
INITIALIZE PRODUCT TO 0
REPEAT
ADD M TO PRODUCT
DECREMENT N
UNTIL N = 0

?AX

BXCX()

7-

CA LOOPLOOPZCCXC
= ZF(C).

CX <> 0) ( AND 1

LOOPNELOOPNZCCXC
= ZF(C).

CX <> 0) ( AND 0

ACCarriage Return

C80(LOOPNE).


8-

??.

-9

?80hFFh
ASCII10.

-10 (

""0C""9A""AC""F)

. C

'YAyCAA@

C?. ( CA

A)

-11 10 CC3

?C.

AND,OR,XOR
:
AND DESTINATION ,
OR
DESTINATION ,
SOURCE
XOR DESTINATION ,
SOURCE

SOURCE

DESTINATIONAA
SOURCEAAA.
.
:

PF,ZF,ZF

:.

AF

:.

CF,OF

:.

A
MASK
:
0
b
b

=
=
=

0
0
0

AND
OR
XOR

b
b
b

,
,
,

=b
=1
=~ b

AND 1
OR
1
XOR 1

b
b
b

:
-10(A)Clear AND
0 MASK'0'1
.
-21(A) SET OR
1 MASK '1 '0
.
-3(A)COMPLEMENTXOR
'1 MASK '0
.

:
'0 AL .

0111 1111b = 7Fh MASKAND


AND AL, 7Fh

SetMSBLSB

ALA

Mask = 1000 0001b = 81hOR


AL , 81h

OR

CDX

Mask1000 0000 0000 0000b = 8000hXOR


XOR DX , 8000h

A)to z
)to Z

( aASCII?61h7Ah

( A ASCII?41h 5Ah

C20hCDL
CDL , 20h

SUB.

A.
CA
a61h = 0110 0001
A61h = 0100 0001
C0
Mask1101 1111b= 0DFh
AND
AND DL , 0DFh

C.


()Clear Register
AAAX,0

MOV

ASUB AX , AXCAAXORA

XOR 0 = 0

XOR 1 = 0

XOR
XOR AX , AX

'0 OR 0 = 0 '1 OR 1 = 1AX , AX

OR

AX ZF
SFAX ) ( ZF = 1
AX , 0

CMP

NOT
NOTComplement

1s(0C1'1C'0

A):
Destination
AX

NOT

NOT

TEST
TESTANDDestination

Destination , Source

PFZFSF

AF

OFCF0

TEST

TEST AC'1A'0
Mask1'0

0 AND b = 0 AND b = b

TEST Destination , Mask

'1C
1

:
ALCCEven_No

0 LSB
MASK1b0000000:
AL , 01h
Even_No

TEST
JZ

:
A?CAAA
.
shift CC A
C .
C:
Destination,1

A Destination,CL

Opcode

Opcode

CL.

)Shift Left (SHL

SHL CA
:
Destination , 1

SHL

AA CL

Destination , CL

SHL

CL

PF , SF , ZF.
CF@C
of1C@CAC.
:

CDH = 8AHCL = 3CLDH SHL DH ,

CL .
:
DH100010103C
h = 0101000050CL()3
.0(DH3A
AC3AA)
:
)(2d (5d) 101C
C1010

)(10d

)(4d.
(2)
) :Shift Arithmetic Left ( SAL
SALSHLSAL
.Machine Code
:
AA CC
AA
AC
80hCL=2A Of , Cf
.
: AAX)(8.
: CC)(3.
MOV CL , 3
SAL AX, CL

):Shift Right (SHR


? SHRSHR Destination,1

CMSBC
LSBC Cf. AC?
CL.

SHR Destination, CL

.SHL
:
DH CF?
MOV DH, 8Ah
MOV CL , 2
SHR DH,CL

:
DH = 10001010

DH = 00100010 = 22h

Cf1
(:Shift Arithmetic Right (SAR
SARSHR A
MSB.A.
Destination , 1

SAR

A
CL
Destination, CL

SAR

:
?2
. A
Cf1C?
(00000101)=5)(00000010.2
:
C?C.
CSHR.
SAR(A
).
:
65143

4.AX

:
AX, 65143
CL,2

MOV
MOV

AX, CL

SHR

:
CAL-15AL.
AL,1

SAR

:
AL2
-7.5-8C
A-1511110001C?
11111000.-8
A?
2 ACAC?C2
C?C
IMUL, MULIDIV, DIV?A
A.

:
)(ROL

Rotate Left

?
CF.

Destination , 1
Destination , CL

ROL
ROL

:) Rotate Right (ROR


ROL A

.A:
Destination ,1
Destination ,CL

ROR
ROR

ROR , ROL CF
:
ROL)(1BX
.BX.Ax

:
;

DX ,16D

MOV

; AX

AX,AX

XOR

; CX,1

MOV

; CF

BX,CX

Top : ROL

NEXT
AX
DX
Top

JNC
INC
NEXT: DEC
JNZ

(RCL) Rotate through Carry Left


? ?

.C.
Destination , 1
Destination , CL

RCL
RCL

Rotate through carry Right RCR


RCLA

Destination , 1
Destination ,CL

RCR
RCR

:
CDH8Ah
CF=1CL3DH

RCR DH, CL

DH

CF

10001010

11000101
01100010
10110001

0
1
0

ADHB1h .

:
A?AL
DLCAL11011100
00111011.BL
:
SHL
RCR
BL8.?
MOV CX, 8
AL,1
BL,1
Reverse
AL , BL

SHL
RCR
Loop
MOV

Reverse:

:
??AA
.
-1:

Return

.Carriage

'0'1 CC)(1, 0
.
BX:
) Clear BX ( BX will hold Binary values
)Input a character ( 0 OR 1
While character < > CR DO
Convert character to binary value
Left shift BX
Insert value into LSB of BX
Input a character
End_While

C110:
Clear BX :
BX = 0000 0000 0000 0000
Input character 1 , convert to 1
Left shift BX:
BX = 0000 0000 0000 0000
Insert value into LSB of BX:
BX = 0000 0000 0000 0001
Input character 1, convert to 1
Left shift BX:
BX = 0000 0000 0000 0010

Insert value into LSB of BX: BX = 0000 0000 0000 0011


Input character 0 , convert to 0
left shift BX :
BX = 0000 0000 0000 0110
Insert value into LSB of BX
BX = 0000 0000 0000 0110

BX110b
A'01A
16 CACC17A
CC18.
BXBX
CORA
( 00)A
OR 0 = b

bOR

?
:
A

BX,BX
AH,1

XOR
MOV

21h

INT

AL, 0Dh
END_While

While_:
CMP
JE

AL , 0fh

AND

BX, 1

SHL

; BL

BL, AL

OR

21h

INT

JMP
_While
END_While:

2-:Binary Output
C C
C . 1
1C.'0
FOR 16 times Do
Rotate left BX
If CF = 1 then
Output 1
else
Output 0
end - if
END_FOR

.
3-:Hex input
'0C'9'AC'F
.A
4().
CA
C( A)
.:
Clear
BX
Input Hex character
While character <> CR Do
Convert character to Binary value
Left shift BX 4 Times
Insert value into lower 4 bits of BX
input a character
End_While

AA

BX , BX
CL,4
AH,1

XOR
MOV
MOV

21h

INT

AL , 0dh
END_While

While_:
CMP
JE

A;

"9

AL , 39h

CMP

Letter

JG

AL , 0fh

AND

shift

JMP

AL , 37h

Sub

Letter:

BX, CL

SHL

Shift:

; BX

; BL, AL

OR

21h

INT

_JMP While
END_While:


-4:HEX Output
BX16A4.
A@AC
4:
For 4 times Do
MOV BH to DL
Shift DL 4 times to Right
If DL < 10 then
Convert to character in 0 ......9
else
Convert to character in A..........F
end_if
Output character
Rotate BX left 4 times
END_For

1-?:
01001001

b. 10110001 OR
d. Not 01011110

a. 10101111 AND 10001011


c. 01111100 XOR 11011010

-2:
- A1
BL .
II

BX .

III

-.Word1

-3Test:
.1

'1 CAX.

.2

'0 CDX.

.3

'1 CDX.

.4

1 CDX.

.5

1 CBL
'1

-4

CAL11001011b

CF=1AL

().
b. SHR AL , 1
d. ROR AL, CL ; if CL contains 3
f. RCL AL, CL if CL contains 3

a. SHL AL,1
if CL contains 2
if CL contains 2
if CL contains 3

; c. ROL AL , CL
; e. SAR AL,CL
;g. RCR AL ,CL

-5 AA.
-AB5h
-AL8

-321424AX
--214516BX

-6AA:
.1CALA10.
.2CDLASCII..
7-AA:
.1BL10D.
.2CAL.()8
AH(:.)ROR

:
8-A.
ASCII
1.
TYPE A CHARACTER
: A
THE ASCII CODE OF A IN BINARY IS 01000001
THE NUMBER OF 1 BITS IS 2

9-A.
ASCII.
C.
TYPE A CHARACTER : 7
THE ASCII CODE OF 7 IN HEX IS : 37
TYPE A CHARCTER :

10- A4
A..C
()
A.
TYPE A HEX NUMBER (0000 - FFFF) : xa
ILLEGAL HEX DIGIT, TRY AGAIN ; 1ABC
IN BIRARY IT IS 0001101010111100

-11 16

A..C

(""0A

""1)A.
TYPE A BINARY NUMBER UB TO 16 DIGITS : 112
ILLEGAL BINARY DIGIT , TRY AGAIN : 11100001
IN HEX IT IS EI

-12 AA8

A.

CCA.
TYPE A BINARY NUMBER , UP TO 8 DIGITS : 11001010
TYPE A BINARY NUMBER , UP TO 8 DIGITS : 10011100
THE BINARY SUM IS 101100110

13- AC

.C

A.

C
TYPE A HEX NUMBER (0 FFFF ) : 21AB
TYPE A HEX NUMBER (0 FFFF ) : FE03
THE SUM IS 11FAE

-14 A

C.C

(9 , 0

)A

ENTER A DECIMAL DIGIT STRING : 1299843


THE SUM OF THE DIGITS IN HEX IS : 0024

The Stack and Introduction to Procedures

A?
?Procedures
Apush

pop,

?.
A C
A@
@A)LIFO (Last In first outA
.
STACK 100h

SSC
SP100hC C
.
:PUSH , PUSHF
PUSH
SOURCE

PUSH

A16.
PUSH
AX
:
-1

CSP2

-2

SS:SP

A.
PUSHF .
SP100h PUSHF
C2SP00FEh
.00FE


:POP , POPF
POP
Destination

POP

16()IPA
POP BXPOP:
-1

SS:SP

-2

SP2

POPFAC .
AA A
168.
Push AL
;
ILLEGAL
CUser Program?
?21h

INT

A??

.
:
A@A
LIFO ??.
:
? this is a test
tset a si siht

:
? Display
Initialize count to 0
Read a character
While Character is not a Carriage return Do
push character onto the stack
increment counter
Read a character
End_While
Go to New line
For count times Do
Pop a character from the stack
Display it
End_For

CX C
whileCX
C
CACX.
SMALL
100H
PROC

.MODEL
.STACK
.CODE
MAIN

; display user prompt


MOV AH,2
'?'MOV DL,
INT 21H
;initialize character count
XOR CX , CX
;read character
MOV AH , 1
INT 21H
;while character is not a carriage return do
WHILE_:
AL , 0DH
END_WHILE
AX
CX
21H
_WHILE

CMP
JE
PUSH
INC
INT
JMP

AH , 2
DL , 0DH
21H
DL , 0AH
21H
EXIT

MOV
MOV
INT
MOV
INT
JCXZ

DX
21H
TOP
AH , 4CH
21H

POP
INT
LOOP
MOV
INT
ENDP
MAIN

END_WHILE:

TOP:

EXIT:
MAIN
END

:PROCEDURES
C

C
A.

AC

.
A
? ?C
.High Level Programming Languages
?A?
CALLARET.
:Procedure Declaration
:
Name PROC type
; Body of the procedure
RET
Name ENDP

Name?typeOperandNEARA
FARNEAR A?AFAR
C?.CA
.NEAR
RET()ReturnCC?C.A
ARETCB(
)@.

AACC
CC
AC
AC A.


?A
ACA:

-1

-2

-3

-4

(C)
.

:RET , CALL
?CALLDIRECT

name

CALL

nameB.?Indirect

CALL address_expression

CALL address - expression A


.
?
-1

Return address

CALL?

-2

CAA

IPC

ARETC
C?
Pop_value

RET

Pop_value.CPop_value = NA
N -BytesC.
-:
a,b
-:

Product = 0
Repeat
If LSB of B is 1 then
Product = Product + A
End_if
Shift left A
Shift right B
until B = 0

B<1101bA<111b

product = 0
since LSB of B is 1 , product = 0 + 111b = 111b
shift left A:
A = 1110b
shift right B :
B = 110b
since LSB of B is 0 ;
shift left A :
A=11100b
shift right B :
B = 11b
since LSB of B is 1 ;
product = 111b + 11100b = 100011b
shift left A :
A = 111000b
shift right B :
B =1b
since LSB of B is 1 ,
product = 100011b + 111000b = 1011011b
shift left A :
A = 1110000
shift right B :
B=0
since LSB of B is 0 ,
return Product = 1011011b = 91d

.MODEL
.STACK
.CODE
MAIN

MAIN
MULTIPLY

SMALL
100H
PROC
CALL
MOV
INT
ENDP
PROC
PUSH
PUSH
XOR

MULTIPLY
AH,4CH
21H
AX
BX
DX , DX

REPEAT:
TEST
JZ
ADD

BX , 1
END_IF
DX , AX

SHL
SHR
JNZ
POP
POP
RET
ENDP
MAIN

AX , 1
BX , 1
REPEAT
BX
AX

END_IF:

MULTIPLY
END

BXAX?
.FFhABX AX.DX

AA
A PUSH ??
Apop

:
NAME PROC
Push AX
Push BX

Pop BX
Pop AX
RET
NAME ENDP

:
-1

C
-A

.STACK

100H

SP=

- A
AX = 1234h , BX = 5678h , CX = 9ABCh , and SP=100h
SP , CX , BX , AX?
AX
BX
AX , CX
CX
AX
BX

PUSH
PUSH
XCHG
POP
PUSH
POP

-3

) .( SP=0

.SP=

A.

-4

A?:

A:

CALL PROC1
MOV AX , BX

-A

MOV AX,BX08FD:0203

PROC1Near08FD:300h

SP = 010Ah

SP , IPCALL PROC1

-5

:
-A

AX
.

CX
.

6-

] [ } { ) (.

A@.

C.CC

@C?C

A.C

C A.

A?.

)}](A +{B-(D-E)+[A+B
)](A+ {B-C

7- A1C32767
-

A.

1415XOR.

.15

?:
C?READABX

A-

- C?RANDOMBX

C?WRITEBX.

A???READ?

??RANDOM??WRITE
1004A4
.

Multiplication and Division Instructions

A?
A.
A.
C
AA
C A8A
A16.
AAC
?.

MUL & IMUL


AC
C1000000011111111
. AC
128255.32644AA
A-128-1128

).(32640
C
A:C MUL

).(Multiply

IMUL (Integer

).Multiply8
16A16
32.:
MUL
Source

Source

IMUL

&

A8
A16
8Byte Form
ALSource
CA().
(16).AX
16Word form
AX
CA().(32
)AX , DXAXDX
.DX:AX}:
{
.IMUL, MUL

SF, ZF, AF, PF


Cf/Of:
/MUL
()0)(CF/OF = 0C
)(1C.
/IMUL
0 )(CF/OF = 0C
Sign Extension(AA
MSB) )(1
)(CF/OF = 1C.
A CF/OF)(1
(AL8
AX16).
.

:
?.
/1AX = 1

MUL BX

BX = ffffh ,

65535

-1 IMUL
BX

() AX
ffff
0000ffff
Ffffffff

/2 BX = ffffh, AX=ffffh

MUL BX

()
4294836225

1 IMUL
BX

MUL AX
16769025 IMUL
AX

0000

ffff

()
FFFE0001

AX

DX

0001

FFFE 1

00000001

0001

/3AX = 0fffh
))
16769025

Ffff

DX

CF/OF

()
00ff E00l
00ff E00l

0000

CF/OF
0

AX

DX

CF/OF

Eoo1

00ff

E001

00ff

/4CX = ffffh , AX = 0100h

()
16776960

MUL CX
-256 IMUL
CX

()
00FFFF00
FFFFFF00

AX

DX

CF/OF

FF00

00FF

FF00

FFFF

:
/1CA
A = 5 x A - 12 x B

MOV
AX,5
; AX = 5
; AX = 5 *A
; A = 5 *A
; AX = 12
; AX = 12 x B

IMUL
A
MOV A , AX
MOV AX,12
IMUL
B

; A = 5 x A - 12 x B

SUB

A ,AX

/2
C?PROCEDUREFACTORIAL?
!N(N)?NCX
?N.AX()
:
if N =1 Then
N!=1
if N > 1 Then N ! = N (N - 1) (N - 2) ..... 2 1

PRODUCT = 1
Term = N
For N Times Do
product = product * term
Term = Term -1
END_For

?:
FACTORIAL

PROC
; Computes N1
MOV AX, 1
Top: Mul CX
Loop Top
RET
FACTORIAL ENDP

A?65535
.
DIV , IDIV

C
C)(Divide

DIV

)IDIV (Integer Divide


:
Source
Source

DIV
IDIV

C?
@.
CA8A
A16:


8Byte form
AX
(8)AL(8)
.AH
16Word form
DX , AX(
DX :AXDXAX)
AX.DX
CC.C

.IDiv , Div
A .
Divide Overflow
C
.
. ?
" Divide Overflow.
:C, DX = 0000

BX = 0002 , A x =0005

()
2

Div BX
2 IDIV BX

()
1
1

:CBX = FFFEh , AX = 0005 , DX = 0000

Div B x

()
0

-2 Idiv B x

()
5
1

:CBX = 0002h , AX = fffbh , DX = ffffh


()

Div B x

()

AX

DX

0002

0001

0002

0001

AX

DX

0000

0005

FffE

0001

AX

DX

fffffffbh2(7ffffffeh)AX

1-

-2 Idiv B x

FffE

Ffff

:BL = Ffh , AX = 00fBh

()
0

()
251

AL

AH

FB

Div B L
Divide overflow Idiv B L( -25)AL

Sign Extension of Dividend


/116
DX , AX
AXDX:
.1

Div0DX

.2

IDIVADX
AX(AAX
0DXAX
ffffh)DX CWD

.(convert word to Double wordC ALCAH


)CBW (Convert Byte to Word
:- 12507
; prepare DX

MOV AX , -1250
CWD
MOV BX , 7
IDIV BX

:
AACA
A??
.
A
AC.
C.

Decimal Output
A?outdecAX C
AX()-AX
-AX(AX)
AX.
If AX < 0
print a minus sign
Replace AX By its twos complement
End-if
Get the digits in AXs decimal representation
Convert these digits to characters and print them

123456-

5CAX
3567
3567103567
35610 356
351035
10
stack
count.
count = 0
Repeat
Divide quotient by
10
Push remainder on the stack
count = count + 1
Until quotient = 0

(quotient)AX
6(
count).

For

count times do
Pop a digit from the stack
Convert it to a character
Output the character
End_For

?:
OUTDEC PROC
; Prints AX as a signed decimal integer

; input : AX
; Output : None
PUSH
AX
PUSH
BX
PUSH
CX
PUSH
DX
;if AX < 0
OR
AX , AX
JGE
@END_IF1
;Then
PUSH
AX
MOV
'DL , '-
MOV
AH,2
INT
21H
POP
AX
NEG
AX
@END_IF1:
XOR
CX , CX
;Get Decimal Digit
MOV
BX , 10D
@REPEAT1:
XOR
DX , DX
DIV
BX
PUSH
DX
INC
CX
OR
AX , AX
JNE
@REPEAT1
;Convert Digits to characters and print them
MOV
AH , 2
@PRINT_LOOP:
POP
DX
OR
DL , 30H
INT
21H
LOOP
@PRINT_LOOP
POP
DX
POP
CX
POP
BX
POP
AX
RET
OUTDEC ENDP

?outdec
?.??outdecAA
Assembler C?@
Include.

Filespec

IncludeFilespec

?.Assembler?
.
C?OUTDECAPRocfile.ASM
??:
SMALL
100h

.MODEL
.STACK

.CODE
MAIN PROC
AX , 1234
OUTDEC
AH, 4Ch
21h

MOV
CALL
MOV
INT

MAIN ENDP
INCLUDE PROCFILE.ASM
END Main

Decimal Input
?ASCII
..
Total = 0
Read an ASCII Digit
Repeat
Convert character to a Binary value
Total = total* l0 + value
Read a character
Until character is a carriage return

C157:
Total = 0
Read 1
Convert 1 to 1
Total = 10 x 0 + 1 = 1
Read 5
Convent 5 to 5
Total = 1 x 10 + 5 = 15
Read 7
Convent 7 to 7
Total = 15 x 10 + 7 = 157

AC?INDEC?
?.A -
A.+C(0 )9
?..

Negative = True
Read a character
Read a character

? Print
Total = 0
Negative = False
Read a character
Case character of
-
:

+
:
End_Case
Repeat
if character is not between 0 and 9 then
GO TO Beginning
Else
convert character to a Binary value

total = 10 * total + value


End if
Read a character
Until character is a carriage return
IF negative = True then
Total = -total
End_if

:
INDEC PROC
; Reads a number in range -32768 to 32767
; input : None
; Output : AX = Binary equivalent Of Number
PUSH
BX
PUSH
CX
PUSH
DX
@BEGIN: MOV
AH , 2
MOV
DL , '?'
INT
21H
XOR
BX , BX ; total =0
XOR
CX , CX
;Read A Character
MOV
AH , 1
INT
21H
;Case Char of
CMP
AL ,'-'
JE
@MINUS
CMP
AL , '+'
JE
@PLUS
JMP
@REPEAT2
@MINUS: MOV
CX , 1
@PLUS: INT
21H
@REPEAT2:;If Character Between 0 AND 9
CMP
AL , '0'
JNGE
@NOT_DIGIT
CMP
AL , '9'
JNLE
@NOT_DIGIT
; Convert Character To Digit
AND
AX ,000FH
PUSH
AX
; TOTAL = TOTAL * 10 + DIGIT
MOV
AX , 10
;Get 10
MUL
BX
;AX = TOTAL * 10
POP
BX
;RETRIEVE DIGIT
ADD
BX , AX
; TOTAL = TOTAL*10+DIGIT
;Read A Character
MOV
AH , 1
INT
21H
CMP
AL,0DH
JNE
@REPEAT2
MOV
AX , BX
OR
CX , CX
JE
@EXIT
NEG
AX
@EXIT: POP
DX
POP
CX
POP
BX
RET
@NOT_DIGIT:
MOV
AH , 2

DL , 0DH
21H
DL , 0AH
21H
@BEGIN

MOV
INT
MOV
INT
JMP
ENDP

INDEC

?procfile. ASM?OutDec
???
?INDEC?CAX?
?OUTdecAX
.
TITLE DECIMAL: READ AND WRITE A DECIMAL NUMBER
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
;INPUT A NUMBER
CALL
INDEC
PUSH
AX
;MOVE CURSOR TO NEXT LINE
MOV
AH , 2
MOV
DL , 0DH
INT
21H
MOV
DL , 0AH
INT
21H
;OUTPUT A NUMBER
POP
AX
CALL
OUTDEC
;EXIT
MOV
AH,4CH
INT
21H
MAIN
ENDP
INCLUDE
PROCFILE.ASM
END MAIN

Overflow
?Indec(
) AXA
(-32768C.)32767C
C.Input Overflow
A:total
10.total

99999
999910 AC
327699C32760
.

Negative = True
Read a character
Read a character

? Print
Total = 0
Negative = false
Read a character
case character of
-
:

+
:
End_Case
Repeat
If character is not between 0 & 9 then
GO TO Beginning
Else
Convert character to a value
Total = 10 x total
If overflow then
go to Beginning
Else
Total = total + value
If overflow then
Go To Beginning
End_If
End_If
endif
Read a character
Until character is a carriage return
If Negative = True then
Total = - total
End_if

:
/1DX , AX CF/OF:
MULCBX = 0003h , AX = 0008h

/A

BX

MUL BXC= 1000h , AX = 00ffh

IMUL CXC= FFFFh , AX = 0005h

MOL wordC= FFFFh , AX = 8000h

MUL 10hC= FFE0h

BX

CX
word

AX

/2AX Cf/of:
/A

BL

MUL

= 10h , AL = ABh

BL

BL

TMUL

Ah

MUL

IMUL Byte1= Fbh , AL = 02h

BL

= 10h , AL = ABh
= 01ABh

AX
Byte1

/3DX , AX:
/ADiv BXC= 0000h

B x = 0002h, AX = 0007 , DX

/Div BXC= 0000h

B x = 0010h , AX = FFFEh , DX

/IDIV BXC= 0003h , AX = fffch , DX = ffffh

BX

/Div BXC= 0003h , AX = fffch , DX = ffffh

BX

/4AH , AL]fu:
/ADIV BL = 03h , AX = 000Dh

DL

/Idiv BL= Ffh , AX = FFFBh

BL

/Div BL= 10h , AX = 00ffh

BL

/Div BL

= 02h , AX = FFE0h

BL

/5DXCWDAX:
/A7E02

/8ABCh

/1ABCh

/6AXCBWAL:

/AF0h

/5Fh

/80h

/7
C , B , AWord
A
B
A
if

= 5xA-7
)= (A - B ) * (B - 10
= 6 -9*A
A2 + B2 = C2 then
set cf
else
clear cf
end_if

abcd-

A?Indec

Outdec ,

.
/8?INDEC
/9 A()65535
.

/10 ?)(M/NM < N


:
1. Print .
2. Divide 10 x M By N , getting Quotient Q & Remainder R
3. Print Q
4. Replace M By R & go to step 2

?INDEC?N , M

/11 A

(GCD) Greatest common

DivisorM , N.

032

Divide M by N , getting Quotient (1) and remainder R


If R = 0 , stop N is the GCD of M and N
If R <> 0 , Replace M by N by R and Repeat step 1

Arrays and addressing Modes

.
ACA
AC?.

.
One - Dimensional Arrays
?
BytesAWordsAA@.A
]A[1]A[2]A[3A[N]....N
Msg

MSG[1] = A

ABCDE

)(B

= ]MSG[2.

DB

MSG

()A
:
10,20,30,40,50,60

DW

5Word
A[1] = 10 A[2] = 20 A[3] = 30 A[4] = 40A[5] = 50
Base Address of the array
CCA
0200h:

A
A + 2h
A + 4h
A + 6h

0200h
0202h
0204h
0206h

10
20
30
40

A + 8h

)DUP (Duplicate

50

0208h

Dup
.
)Repeat_Count Dup (value

DupvalueRepeat_count:
)GAMMA DW 100 Dup (0

GAMMA100Word
0@.
)?( DELTA DB 60 Dup

Delta60ByteA

line:

) DB 5 , 4 , 3 DUP ( 2 , 3 DUP ( 0 ) , 1

Line

DB 5 , 4 , 2,0,0,0,1,2,0,0,0,1,2,0,0,0,1

Line

AA
Byte
+1ACWord+2
CS(S =1CByte
= 2

SC)WordN

+( N - 1) * SAN A +

(N - 1) S
:1025 W)?(

DW 100 Dup

W + 9 x 2 = W + 18
25 W + 24 x 2 = W + 48

=*2

) W + (10 - 1

= W + (25 - 1) * 2

AX , W + 18
A x , W + 48
W + 18 , A x

MOV
XCHC
MOV

.CAC
AN
:
Sum = 0
M = 0
Repeat
]Sum = sum + A [M
M = M+1
Until
M = N


?
.
MODES

ADDRESSING

A
:
/1Register Mode
A
MOV A x , B

/2Immediate Mode

MOV A x , 5

AxRegister5
Immediate
/3Direct Mode
A

Words MOV

Ax ,

Words
AAA?:
/4.Register Indirect Mode
ASI

A BXADIABP

APointer
:
][Register

DI , SI , BXCDSBPC
.SS

:
C= 0100h

SI0100h1234h

]AX , [SI

MOV

A100hSIDS: 0100A
()1234hAX(A)AX = 1234h
MOV AX , SI

0100hAX
:
A = 3000h , SI = 2000h , BX = 1000h

DIA

1000h1BACH2000h20FEh
3000h031DhAAData Segment.
AA.:
]BX, [BX

MOV

-]CX, [SI

MOV

A-

-]BX, [AX

MOV

-][SI] [DI

ADD

-]INC [DI

:
A-]BX, [BX

MOV1BAChBX

-]CX, [SI

MOV20FEhCX

]BX, [AX

MOVAX.

-][DI], [SI

ADD

/][DI

INCC3000h

031Eh
: A? WAXC
W DW 10,20,30,40,50,60,70,80,90,100
:
SI ?
2()WordCSI
:
AX , AX
SI , W
CX , 10
]AX , [SI

XOR
LEA
MOV
ADDNOS :
ADD

ADD SI ,2
LOOP ADDNOS

: AC?REVERSEN
Words( ).
: CN N/2
ACS1CD1
SICADIC@.
DI2CSI

, SI

2DI(.)Words
REVERSE

PROC

: SI

)DI = SI + 2 (n - 1
Cx = n/2

;
;

- S

; Outputs : SI
Push
Push
Push
Push
Push

@
Cx = n
Bx = n

; Inputs

BX

AX
BX
CX
SI
DI

;
;

DI , SI
Cx , Bx
BX
BX , 1
DI , Bx
Cx , 1
]AX , [SI
]AX , [DI
[SI],
AX
SI ,2
DI , 2
XCHg_Loop
DI
SI
CX
BX
AX
ENDP

; D1
Mov
Mov
Dec
SHL
ADD
ShR
XCHG_Loop:
Mov
XCHC
Mov
ADD
Sub
Loop
Pop
Pop
Pop
Pop
Pop
RET
REVERSE

/5Indexed and Based Addressing modes


CDisplacement
AA.
-

+ 2

C:
] [ Register +Displacement
] [ Displacement + Register
[ Register ] +Displacement
] Displacement + [ Register
] Displacement [ Register

AABXBPSI CDIABXASI
ADIDSCACBPSS
C.
CBXABPBasedIndexedC
SIA.DI
C WWord ArrayABX
4W + 4AX
]AX , W [ BX

MOV

:
] AX , [ W + BX
] AX , [ BX + W
] AX , W +[ BX
AX , [ BX ] + w

@ASI WArray

MOV
MOV
MOV
MOV

.WordA

W + 2AX:

] AX , [ SI + 2
] AX , [ 2 + SI
] AX , 2 + [ SI
AX , [ SI ] + 2
] AX , 2 [ SI

MOV
MOV
MOV
MOV
MOV

A()?W
AXC:DW 10,20,30,40,50,60,70,80,90,100

:
AX , AX
BX , BX
CX , 10
] AX , w [ BX

XOR
XOR
MOV
ADDNOS:
ADD

ADD BX , 2
LOOP ADDNOS

C2SI A
Words

A Alpha:
A:

0123h, 0456h, 0789h, 0abcdh


BX = 2

ALPHA

DW

SI =4, DI = 1A1084h

00022BACh.0004
AC
:
] AX , [ALPHA + BX
] BX , [ BX+ 2
] CX , ALPHA [ SI
] AX , -2 [ SI
] BX , [ALPHA + 3 + DI
AX , [ BX ] 2
] BX , [ALPHA + AX

MOV
MOV
MOV
MOV
MOV
MOV
ADD

a.
b.
c.
d.
e.
f.
g.

A
B
C
D
E
F
G

0456h
2BACh
0789h
1084h
0789h

APLPHA +2
2+2=4
ALPHA + 4
-2 + 4 = 2
ALPHA + 3 + 1

AX

PTR:LABEL
AA
ByteAWORD. C
A
WORD.
AX , 1

Byte
AL , 1

MOV
MOV


[ BX ] , 1

MOV

wordAByte.
AByte
PTR [ BX ] , 1

AWORD

PTR [ BX ] , 1

BYTE

MOV

WORD

MOV

:MSGT
:
:
Register indirect mode

LEA SI, Msg


BYTE PTR [SI], T

MOV

:Index Mod
SI, SI
mSG[ SI ] , T

XOR
MOV

PTRAMsg

PTR:
PTR :
Type PTR Address_Expression
TypeByteAWORDADwordAddress_ExpressionDBA DW
ADD
C:
1Ah
52h

DB
DB

DOLLARS
CENTS

CADollarsALCentsAH
A
ILLEGAL

AX , DOLLARS

MOV

AByteWordC

MOV AX ,word PTR DOLLARS ; AL=DOLLARS , AH =Cents

521AhAX

:LABEL
LABEL
:

MONEY
LABEL
WORD
DOLLARS
DB
1Ah
CENTS
DB
52h
MONEYWordDOLLARS

CENTSByte.
Ax , Money

MOV

AL , DOLLARS
AH , CENTS

: :

MOV
MOV
.DATA

DW
LABEL
DW
LABEL
DB
DB

1234H
BYTE
5678H
WORD
9AH
0BCH

A
B
C
C1
C2

MOV AX , B
1
2

MOV AH , B

MOV CX , C

MOV BX , WORD PTR B

MOV DL , BYTE PTR C

MOV AX , WORD PTR C1

78h

0BC9Ah

5678h
9Ah
0BC9AH

Segment Override
RegistersBX SIDI
.DS
@:

]Segment_Register : [ Pointer_Register

]Ax , ES : [SI

MOV

ESSICAX
A
.

:Accessing the Stack


ABPSS
?.
:
AA, B X , AX

CX

.
:
MOV
MOV
MOV
MOV

BP , SP
]AX , [ BP
]BX , [ BP + 2
]CX , [ BP + 4

::
. C
Select Sort

N
:A] A [1C]A [N
]A [NIC- 1

:A] A [ 1C]A [N - 1
]A [N-1IC- 2

:N - 1A] [I

AC]A [2

]A [1
:
2
1

21

21

16

40

16

40

40

21

16

40

21

16

40

21

16

:
i = N
For N - 1 Times Do
Find the position K of the Largest element among A [1] .. A [ I ]
SWAP A [K] and A [ 1 ]
I : = I - 1
End_For

:
SELECT

PROC
;SORTS A BYTE ARRAY BY THE SELECTSORT METHOD
;INPUTS:SI= ARRAY OFFSET ADDRESS
;
BX=NUMBER OF ELEMENTS
;OUTPUTS:SI=OFFSET OF SORTED ARRAY
;USES:SWAP
PUSH
BX
PUSH
CX
PUSH
DX
PUSH
SI

DEC
JE
MOV
SORT_LOOP:
MOV
MOV
MOV
MOV
FIND_BIG:
INC
CMP
JNG
MOV
MOV
NEXT:
LOOP
CALL
DEC
JNE
END_SORT:
PUSH
PUSH
PUSH
PUSH

BX
END_SORT
DX , SI
SI
CX
DI
AL

,
,
,
,

DX
BX
SI
[DI]

SI
[SI], AL
NEXT
DI , SI
AL , [DI]
FIND_BIG
SWAP
BX
SORT_LOOP
SI
DX
CX
BX

ENDP

SELECT

PROC
;INPUT: SI=ONE ELEMENT
;
DI=OTHER ELEMENT
;OUTPUT:EXCHANGED ELEMENTS
PUSH
AX
MOV
]AL , [SI
XCHG
]AL , [DI
MOV
[SI] , AL
POP
AX
RET
ENDP

SWAP

SWAP

?SELECTASI
NBX.
A

TITLE SORT: SELECT SORT PROGRAM


.MODEL SMALL
.STACK 100H
.DATA
A DB 5 , 2 , 1 , 3 , 4
.CODE
MAIN PROC
MOV
AX , @DATA
MOV
DS , AX
LEA
SI , A
CALL
SELECT
;dos exit
MOV AH,4CH
INT 21H
MAIN
ENDP
INCLUDE PROCFILE.ASM
END MAIN

Debug:
C?

-GC
AX=100D BX=0005 CX=0049 DX=0000 SP=0100 Bp=0000 SI=0004 DI=0000
DS=100D ES=0FF9 SS=100E CS=1009 IP=000C NV UP EI PL NZ NA PO NC
1009:000C E80400 CALL 0013

??


-D 4 8
100D:0000 05 02 01 03- 04

??

-GF
AX=1002 BX=0005 CX=0049 DX=0000 SP=0100 Bp=0000 SI=0004 DI=0005
DS=100D ES=0FF9 SS=100E CS=1009 IP=000F NV UP EI PL ZR NA PE NC
1009:000F B44C MOV AH , 4C

-D 4 8
100D:0000 01 02 03 04- 05

][ I, 1

B18

.1_Major Order

Row

.2_Column Major Order

B34A10203040
,50,60,708090,100 110,120
.
_
10, 20,30,40

-:
20 , 60 , 100

DW

50 , 60 , 70 , 80
90 , 100, 110 , 120

DW
DW

DW

10 , 50 , 90
DW

DW
DW

30 , 60 , 110
40 , 80 , 120

A_.
A_C
_C
.
CC
ACA?C
_?_
:
AAMN_A
S(AS=1
ByteS=2Word).
] =A [ I , j
:

.1CAI

.2C j

A
N
+ s * N

+2* N*S

+ (I - 1 ) N * S

:
j( j - 1) * s((
)j - 1) A [ I ,

] j_
A + ( i - 1) N s + ( j - 1 ) s
C_A A

]] [ I ,
A + ( j - 1) M S + ( I - 1 ) s

AMN_

.1AI

.2Aj

.3

.1AI
A + (I - 1) + N S

.2Aj
A + ( j - 1) S

.3
N x S

:based - indexed

.1(BXA BP)
.2(SIA)DI
.3
.4(A)

CBXDS
CBPSS

]Variable [ Base_Register ] [ index_Reg


][ Base_Reg + index_Reg + VAR + const
]VAR [ Base_Reg + index_Reg + Const
]Const [ Base_Reg + Index + Var

1.
2.
3.
4.

A WBX2SI
.4W+6
Ax
]AX , W [ BX] [ SI
]MOV AX , W [ BX+ SI
] MOV AX , [ W + BX + SI
MOV AX , [ BX + SI ] W

MOV


: A57Awords
_Based - Indexed?: .1
0
.20
: -1A
A + ( 3 - 1) x 7 x 2 = A + 2 x 7 x 2 = A + 28
MOV Bx, 28
XOR S I ,SI
MOV Cx , 7
CLEAR :
MOV A [ Bx] [SI] , 0
ADD SI , 2
LOOP CLEAR

-2A

A + ( 4 - 1) x 2 = A + 3 x 2 = A + 6

14(7x2)

A [ Bx] [SI] , 0

MOV SI , 6
XOR BX ,BX
MOV Cx , 5
CLEAR :
MOV
ADD BX , 14
LOOP CLEAR

XLAT:
.XLAT(
)ByteAL
BX:
.1ALCBX
.2AL

AAL0hFhASCII

(6h36h0ch42hAB).....
TABLE
DB
30h, 31h,32h, 33h, 34,35h, 36h, 37h, 38h, 39h
DB
41h, 42h , 43h, 44h, 45h, 46h

(chC)c

AL , och

Mov

LEA BX, TABLE


XLAT

(@)
(@)A.
.
TITLE secret message
.MODEL SMALL
.STACK 100H
.DATA
CODE_KEY
DB 65 DUP(' '),'XQPOGHZBCADEIJUVFMNKLRSTWY'
DB 37 DUP (' ')
DECODE_KEY DB 65 DUP(' '),'JHIKLQEFMNTURSDCBVWXOPYAZG'
DB 37 DUP (' ')
CODED
DB 80 DUP ('$')
PROMPT
DB 'ENTER A MESSAGE :' , 0DH , 0AH , '$'
CRLF
DB 0DH , 0AH , '$'
.CODE
MAIN PROC
; initialize DS
MOV
AX,@DATA
MOV
DS,AX
;print user prompt
LEA
DX,PROMPT
MOV
AH,09H
INT
21H
;READ AND ENCODE MESSAGE
MOV
AH , 1
LEA
BX , CODE_KEY
LEA
DI , CODED
WHILE_:
INT
21H
CMP
AL , 0DH
JE
END_WHILE
XLAT
MOV
[DI],AL
INC
DI
JMP
WHILE_
END_WHILE:
;GOTO NEW LINE
MOV
AH , 9
LEA
DX , CRLF
INT
21H
;PRINT ENCODED MESSAGE
LEA
DX,CODED
INT
21H
;GOTO NEW LINE
LEA
DX,CRLF
INT
21H
;DCODE MESSAGE AND PRINT IT

AH , 2
BX , DECODE_KEY
SI , CODED

MOV
LEA
LEA
WHILE2:

MOV
]AL , [SI
CMP
'AL ,'$
JE
END_WHILE2
XLAT
MOV
DL ,AL
INT
21H
INC
SI
JMP
WHILE2
END_WHILE2:
;return to DOS
MOV AH,4CH
INT 21H
MAIN
ENDP
END MAIN

.1:

AX0500h
BX1000h
SI1500h
DI2000h
1000h0100h
15000150h
20000200h
30000400h
40003000h
BetaWord1000h
(A
)

.2CA

]b- MOV DI , [DI


]d- SUB BX, , [DI
]f- ADD, SI], [DI
]h- ADD, AH, [SI

]a- MOV DI , [SI


]c- ADD AX , [SI
]e- LEA BX ,Beta [BX
]g- ADD BH , [BL
]c- MOV AX, [BX + DI + beta
DW
1,2,3
DB
4,5,6
LABEL word
DB
ABC

A
B
C
Msg

ABXC.A

AH , BYTE PTR A
AX , word PTR B
AX , C
AX , Msg
AH , BYTE PTR C

.3BP(push)pop

MOV
MOV
MOV
MOV
MOV

abcde-

/AA

/A5CST_ARR

ST_ARRST_ARR+2
.4CA10wordB
Byte
/A

(A] A [ I

]A[1 + 1)]A [ 10
].A[1
/DXA.
/AB.SIEC.C
'E1 cf
.5AC?Find_ijI , J
Ij_?
IAXiBXNCx
DX. DX.
:
.6C?BUBBLE
Sort

Bubble?

SIBX.
A
BLANK.??Bubble
.

? 1 2
1 2

6 537
3 567
:Bubble

J2CN ] A [J ] A [j - 1C]A [ J ] < A[ J 1

AN
: J2CN-1 ] A [J ]C A [j - 1]A [J ] < A[ J 1
AN-1
:
:N - 1C]A[ 2] < A [1] A [ 2] A [ 1

.7:
, 67 , 54 , 9 ,8 , 31
, 30 , 50 , 59 ,42 , 53
, 65 , 73 , 85 ,18 , 90

CLASS
DB
Ali
DB
HASSAN
DB
AHMED

?7
AA
.8A100
(_) ?
. .ESC

:
?A
A
?D
AD
?B
ABD
?a
ABDa
>?<esc
.9AC?PRINTHEXXLATBX

. ?4
?IN_HEX?.??
PRINTHEXC.


String Instructions

?.

A
>A
>A
>A
>A
A
?
AA
A.

:DF
A

Flags

Control

ADI , SI
. . C
DIA SICA
C0
.DF
C1 A
C.

CLD ; clear Direction flag

STD ; set Direction flag

String

:Moving

C:
Hello
) ? ( 5 Dup

String1
String2

DB
DB

A
A.
MOVSBA.
DS:SICES:DI
.ADI:SIC
0.()1
()2:
MOV AX ,@DATA
MOV DS, AX
MOV ES, AX
LEA SI , String1
LEA DI , String2
CLD
MOVSB
MOVSB
:

MOVSB AA.

:REP
MOVSB.
()MOVSBCX

REP MOVSB

MOVSBN.CX
MOVSB.CX=0

SI , String1
DI , String2
CX, 5
MOVSB

CLD
LEA
LEA
MOV
REP

:
A?String1CString 2
.

SIC(A)DIC
.SI(1
)ADI2C
1MOVSB.1
SI, String1 + 4
DI, String2
5

CX,

LEA
LEA
STD
MOV
MOVE:

MOVSB
ADD DI ,
LOOP MOVE

:MOVSW
MOVSBWORDByte
DS: SICES:DIC
.ACSI

DI,2

(DF = A= 1

)DF

:
:
? 10,20,40,50,60,

ARR DW

C30.40 , 20ADS
ESC.
:
60 , 50,40C30
SI , ARR + 8h
; SI Points to 60
DI , ARR +0Ah
? ; DI Points to
CX,3
MOVSW
WORD PTR [DI], 30

:Storing String

STD
LEA
LEA
MOV
REP
MOV

STOSBAL
ES:DI.DICDF=0
CCDF=1
STOSWAXC
ES: DI.ADI
.
AString1
LEA
DI, String1
MOV AL, A
CLD
STOSB

:
1?21h?.?
STOSB.
?READ_STR?
Carriage Return.
???DI
?CBX.CA
CBack_Space
?:
Chars_Read = 0
Read a Character
While character is Not a carriage Return Do
If character is a Back_Space Then
Chars_Read = Chars_Read - 1
Remove Previous character from String
Else
Store character in String
Chars_Read = Chars_Read + 1
End_If
Read a character
End_While

READ_STR
PROC NEAR
;READS AND STORES A STRING
;INPUT:
DI ODFFSET OF THE STRING
;OUTPUT:
DI OFFSET OF THE STRING
;
BX=NUMBER OF CHARACTERS READ
PUSH
DX
PUSH
DI
CLD

BX , BX
AH , 1
21H

XOR
MOV
INT
WHILE1:

CMP
AL , 0DH
JE
END_WHILE1
;IF CHARACTER IS BACHSPACE
CMP
AL , 8H
ELSE1
DI
BX
READ

JNE
DEC
DEC
JMP

BX

STOSB
INC

ELSE1:
READ:
21H
WHILE1
DI
AX
ENDP

INT
JMP
END_WHILE1:
POP
POP
RET
READ_STR

String

:Load

LODSBAL
DS:SI.ASI1
.
LODSWAX
DS:SI.ASI2
.
:
?Disp_StrCSI
BX.
For count times Do
Load a String Character into Al
Move it to DL
Output Character
End_For

Proc
SI : offset of the String
BX : No of Characters to Display
None
AX
BX

DISP_STR
; inputs
;
; Outputs
PUSH
PUSH

PUSH
PUSH
PUSH
MOV
JCXZ
CLD
MOV

CX
DX
SI
CX, BX
P_EXIT
AH , 2h

TOP:
LODSB
MOV
INT
LOOP

DL , AL
21h
TOP

P_EXIT:
POP
POP
POP
POP
POP
RET
DISP_STR

SI
DX
CX
BX
AX
ENDP

:Scan String
SCASB A
AL.ES:DIAL
.A
DI .
SCASWAXAL
SCSABA?.
ABC

DB

AX, @ DATA
ES, AX
DI , String1
AL, B
;Scan first byte
; Scan second Byte

String1
:
MOV
MOV
LEA
MOV
CLD
SCASB
SCASB

0A

41hA42h.B
.

CX

SCASB

REPNZ

CXCAX
CX A
.
:
ConsonantsA

.Vowels

:
initialize Vowels_Count and Consonant_Count to zero
Read and Store a String
Repeat
load a String Character
IF it is a Vowel Then
Increment Vowel_Count
else if it is a Consonant Then
Increment Consonant_Count
End_IF
Until End of string
Display Vowels_Count and Consonant_Count

.MODEL SMALL
.STACK 100H
.DATA
STRING DB
80 DUP(0)
VOWELS DB
'AEIOU'
CONSONANTS
DB
'BCDFGHJKLMNPQRSTVWXYZ'
OUT1
DB
0DH,0AH,'VOWELS= $'
OUT2
DB
CONSONANTS= $'
VOWELCT
DW
0
CONSCT DW
0
.CODE
MAIN PROC
; initialize DS
MOV
AX,@DATA
MOV
DS,AX
MOV
ES,AX
LEA
DX,STRING
CALL READ_STR
MOV
SI,DI
CLD
REPEAT:
LODSB
LEA
DI,VOWELS
MOV
CX ,5
REPNE SCASB
JNE
CK_CONST
INC
VOWELCT
JMP
UNTIL
CK_CONST:

LEA
DI,CONSONANTS
MOV
CX,21
REPNE SCASB
JNE
UNTIL
INC
CONSCT
UNTIL:
DEC
BX
JNE
REPEAT
;OUTPUT NO OF VOWELS
LEA
DX,OUT1
MOV
AH ,9
INT
21H
MOV
AX,VOWELCT
CALL OUTDEC
;OUTPUT NO OF CONSONANTS
LEA
DX,OUT2
MOV
AH ,9
INT
21H
MOV
AX,CONSCT
CALL OUTDEC
;EXIT TO DOS
MOV
AH,4CH
INT
21H
MAIN
ENDP
INCLUDE PROCFILE.ASM
END
MAIN

:Compare String
COPSBES:DI
DS:SI .
, SI

DI .

CMPSW.Words
String1
DB
ACD
DB
ABC
Ax, @ DATA
DS, Ax
ES, Ax

A
B
D

SI, String1
DI, String2
;sub A from
;sub B from
;sub C from

String2
MOV
MOV
MOV
CLD
LEA
LEA
CMPSB
CMPSB
CMPSB

REPE()Repeal While equal


AC
CAA.
ASTR1STR210.
BXC1AX

CSTR12C
.
CX,10
SI, STR1
DI, STR2
CMPSB
STR1_FIRST
STR2_FIRST
AX, 0
EXIT
AX, 1
Exit
AX,2

MOV
LEA
LEA
CLD
REPE
JL
JG
MOV
JMP
STR1_FIRST:
MOV
JMP
STR2_FIRST
MOV
EXIT:

:
AAC
A:
ABC
CAB
ABABCA

DB
DB
DB

SUB1
SUB2
MAINST

ABC
ABABCA

SUB1
MAINST

ABC
ABABCA

SUB1
MAINST

ASUB1?A
?
?

ABC
ABABCA

SUB1
MAINST

SUB1SUDSTRING
CC
.CA
STOP
STOP = MAINST + Length of MAINST - Length of sub string

Prompt the use to enter SUBST


Read SUBST
Prompt the User to enter MAINST
READ MAINST

If(Length of MAINST=0) Or (Length of SUBST= 0) Or SUBST longer than


)MAINST
Then
SUBST Is Not substring of MAINST
Else
Compute STOP
Start = Offset of MAINST
Repeat
Compare corresponding chars in MAINST (from START on) and
SUBST
if All chars match then
SUBST Found in MAINST
else
START = START + 1
END_IF
)Until (SUBST found in MAINST or (START > STOP
END_IF
Display Results

A:

()

ES:DI

DS:SI

MOVSB

MOVSW

ES:DI

DS:SI

CMPSB

CMPSW

ES:DI

AL OR AX

STOSB

STOSW

AL OR AX

DS:SI

LODSB

LODSW

ES:DI

AL or AX

SCASB

SCASW

:
1- ASI100h100h10h
ADI00h2101h15h

20h

AAX4142h200h
A DF0201h25h

, SI

STOSB
LODSW

.2

cf-

DL

MOVSW
LODSB

be-

MOVSB
STOSW

a
d-

FGHIJ
ABCDE
5
)?( DUP

DB
DB
DB

STRING1
STRING2

.3

A?
ABCDEFGHIZ
A?

.4

0
this is an ASCIIz String ,

DB

STR

C?LengthDX
CX.
A:

.5

c- LODSB

.6:

b- STOSB
e- CMPSB

MOVSB
SCASB

ad-

String DB TH *S* AR
* 'E

.7

:
String1 DB TH I S I S A T E S T
)?( String2 DB 11 DUP

?CC.

:
.8 A

" MADAM I

AM ADAM.
A? ()
. ?.
.9:
123
12465
131
?A10.

.10 ?AA
.11 C?INSERTSTRING1

STRING2.
:

SI
DI
BX
CX
AXC

DI

BX

?N??INSERT

.12C?DELETEN
.
:

DI

BX
CX
SI?

DI
BX

A?
.??DELETE.

Practical Applications

? A

:
30h?Int 21hC
6.22AC
Minor622 ?
ALAH.
====================================================================;
;
program: DosVer.asm
;
purpose: gets the DOS Version using
;interrupt 21h function 30h
;
purpose: gets the DOS Version using
interrupt 21h
function 30h
;
input : None
;
output : Minor and Major versions
;
usage : OUTDEC procedure in procfile.asm
;
update :
====================================================================;
.MODEL SMALL
.STACK 100H
.DATA
CR
EQU 0DH
LF
EQU 0AH
'?' MAJOR DB
'?' MINOR DB
MSG
DB 'GET DOS VERSION:INT 21H FUNCTION 3OH',CR,LF,'MS-DOS
'Version ','$
'DB CR,LF,'MAJOR VERSION NUMBER IS :$
'DB CR,LF,'MINOR VERSION NUMBER IS :$

MSG1
MSG2

.CODE
MAIN PROC
;initialization
MOV AX,@DATA
MOV DS,AX
;get dos version
MOV AH,30H
INT 21H
MOV MAJOR,AL
MOV MINOR ,AH
;display results

LEA DX,MSG
MOV AH,9h
INT 21H
LEA DX,MSG1
MOV AH,9h
INT 21H
XOR AX,AX
MOV AL,MAJOR
CALL OUTDEC
LEA DX,MSG2
MOV AH,9h
INT 21H
XOR AX,AX
MOV AL,MINOR
CALL OUTDEC
;return to dos
MOV AH,4CH
INT 21H
MAIN ENDP
Include Procfile.asm
END
MAIN

:
Int 21h?2Ah
:?
;====================================================================
;
program: sysDate.asm
;
purpose: gets the year,month,day,and day of the week
;
from the system using interrupt 21h function 2Ah
;
Calling Registers : AH = 2A
;
Return registers:
;
CX : year(1980 - 2099)
;
DH : month(1 - 12)
;
DL : day(1 - 31)
;
AL : day of the week (0 =Sunday, 1 =Monday,etc )
;
usage : OUTDEC procedure in procfile.asm
;
update : 27/11/2000
;====================================================================
.MODEL
SMALL
.STACK
100H
.DATA
CR
EQU
0DH
LF
EQU
0AH
MSG
DB
'GET SYSTEM DATE :INT 21H FUNCTION 2A',CR,LF
DB
'YEAR :$'
YEAR DW
'?'
MSG2 DB
CR,LF,'MONTH :$'
MONTH DB
'?'
MSG3 DB
CR,LF,'DAY
:$'
DAY
DB
'?'
MSG4 DB
CR,LF,'DAY OF WEEK:','$'
Dweek DB
'?'
SUN
DB
'Sunday $'
MON
DB
'Monday $'
TUES DB
'Tuesday $'
WEDN DB
'Wednesday $'
THURS DB
'Thursday $'
FRID DB
'Friday $'
SAT
DB
'Saturday $'

.CODE
MAIN PROC
;initialization
MOV
AX,@DATA
MOV
DS,AX
;get system date
MOV
AH,2AH
INT
21H
;assign values of date
MOV
YEAR,CX
MOV
MONTH,DH
MOV
DAY,DL
MOV
Dweek,AL
;
MOV
DL,dWEEK
MOV
AL,2H
INT
21H
;display values of date
LEA
DX,MSG
MOV
AH,09H
INT
21H
;year
MOV
AX,CX
CALL OUTDEC
;month
LEA
DX,MSG2
MOV
AH,09H
INT
21H
XOR
AX,AX ;clear AH and AL
MOV
AL,MONTH
CALL OUTDEC
;day
LEA
DX,MSG3
MOV
AH,09H
INT
21H
XOR
AX,AX
MOV
AL,DAY
CALL OUTDEC
; display the equivalent day of week
LEA
DX,MSG4
MOV
AH,09H
INT
21H
CMP
Dweek,0
JE
ZERO
CMP
Dweek,1
JE
ONE
CMP
Dweek,2
JE
TWO
CMP
Dweek,3
JE
THREE
CMP
Dweek,4
JE
FOUR
CMP
Dweek,5
JE
FIVE
CMP
Dweek,6
JE
SIX
JMP
END_CASE
ZERO:
LEA
DX,SUN
JMP
DISPLAY_
ONE:

LEA
JMP

DX,MON
DISPLAY_

TWO:
LEA
JMP
THREE:
LEA
JMP
FOUR:
LEA
JMP
FIVE:
LEA
JMP
SIX:
LEA
DISPLAY_:
MOV
INT
END_CASE:
MOV
INT
MAIN ENDP
Include
END
MAIN

DX,TUES
DISPLAY_
DX,WEDN
DISPLAY_
DX,THURS
DISPLAY_
DX,FRID
DISPLAY_
DX,SAT
AH,09H
21H
AH,4CH
21H
procfile.asm

:
Int

21h?2Ch

:
;====================================================================
;
program: sysTime.asm
;
purpose: gets the hour,minutes,seconds,and hundredth of seconds
;
from the system using
;
calling registers: AH = 2Ch
;
return registers: CH =Hour(O - 23)
;
CL =Minutes(O - 59)
;
DH =Seconds(O - 59)
;
DL =Hundredths of seconds(O - 99)
;
input : None
;
output : hour,minutes,seconds,and hundredth of seconds
;
usage : OUTDEC procedure in procfile.asm
;
update : 28/11/2000
;====================================================================
.MODEL SMALL
.STACK 100H
.DATA
CR
EQU 0DH
LF
EQU 0AH
MSG
DB 'GET SYSTEM TIME :INT 21H FUNCTION 2C',CR,LF,'$'
TM
DB ?
.CODE
MAIN PROC
;initialization
MOV
AX,@DATA
MOV
DS,AX
;print msg
LEA
DX,MSG

MOV
AH,09H
INT
21H
;get system time
MOV
AH,2cH
INT
21H
;assign values of time
MOV
BX,DX
; store sec and hundred of secs from DX
XOR
AX,AX
; ax:=zero
MOV
AL,CH
;hour
CMP
AL,12d
JG
GREAT
MOV
TM,'a'
jmp
CONTINUE
GREAT:
SUB
AL,12
MOV
TM,'p'
CONTINUE:
CALL OUTDEC
MOV
DL,':'
MOV
Ah,02H
INT
21H
AND
AX,0
;ax:=zero
MOV
AL,CL
;minutes
CALL OUTDEC
MOV
DL,':'
MOV
Ah,02H
INT
21H
MOV
AX,0
;ax:=zero
MOV
AL,BH
;seconds
CALL OUTDEC
MOV
DL,'.'
MOV
Ah,02H
INT
21H
MOV
AX,0
; ax:=zero
MOV
AL,Bl
;hundred of seconds
CALL OUTDEC
;print space
MOV
DL,' '
MOV
AH,02H
INT
21H
MOV
DL,TM
MOV
AH,02H
INT
21H
;return to dos
MOV
AH,4CH
INT
21H
MAIN ENDP
Include ProcFile.asm
END
MAIN

:
Int

21h?2Bh

:
TITLE Setdate.asm
;====================================================================
;
Purpose: sets the System date using interrupt 21h
;
function 2Bh

;
Calling Registers :
;
AH = 2B H
;
CX : year(1980 - 2099)
;
DH : month(1 - 12)
;
DL : day(1 - 31)
;
Return Registers :
;
AL = 00 if success to change the system date
;
usage : INUNDEC procedure in procfile.asm
;
update : 27/11/2000
;====================================================================
.MODEL SMALL
.STACK 100H
.DATA
LF EQU 0DH
CR EQU 0AH
prompt
DB
LF,CR,'Enter The Day
: $'
MSG_M
DB
LF,CR,'Enter The Month : $'
MSG_Y
DB
LF,CR,'Enter The Year(1980..2099) : $'
MSGSUC
DB
LF,CR,'Your Date Is Changed.$'
MSGFAIL
DB
LF,CR,'Your Date Is Not Changed.'
DB
LF,CR,'Do You Want To Try Again Y/N? $'
MSGINV
DB
LF,CR,'Invalid Date...'
DB
LF,CR,'Do You Want To Try Again Y/N? $'
year
DW
'?'
month
DB
'?'
day
DB
'?'
.CODE
MAIN PROC
MOV
AX,@DATA
MOV
DS,AX
begin :
; Display Prompy Message
MOV
AH,9
LEA
DX , prompt
INT
21H
; Read the Day
CALL INUNDEC
CMP
AL , 1
JL
begin
CMP
AL , 31D
JG
begin
MOV
DAY , AL
@month :
MOV
AH , 9
LEA
DX , MSG_M
INT
21H
; Read the Month
CALL INUNDEC
CMP
AL , 1
JL
@MONTH
CMP
AL , 31D
JG
@MONTH
;CALL INUNDEC
MOV
MONTH , AL
@YEAR :
MOV
AH,9
LEA
DX , MSG_Y
INT
21H
; Read the Year
CALL INUNDEC
CMP
AX , 1980D

JL
@YEAR
CMP
CX , 2099D
JG
@YEAR
; Set Date using Function
MOV
CX , AX
;
MOV
DH , MONTH
;
MOV
DL , DAY
;
MOV
AH , 2BH
INT
21H
;IS DATE CHANGED ?
CMP
AL , 00H
JNE
AGAIN
MOV
AH , 9H
LEA
DX , MSGSUC
INT
21H
JMP
EXIT
again:
MOV
AH , 9H
LEA
DX , MSGFAIL
INT
21H
answer: ;ANSWER Y/N
MOV
AH , 1H
INT
21H
CMP
AL , 'Y'
JE begin
CMP
AL , 'y'
JE
begin
CMP
AL , 'n'
JE
EXIT
CMP
AL , 'N'
JE
EXIT
JMP
ANSWER
exit:
MOV
AH , 4CH
INT
21H
MAIN ENDP
include procfile.asm
END
MAIN

2Bh
CX = The Year
DH = The Month
DL = The Day

:
Int 21h?2Dh
:
TITLE Settime.asm
;====================================================================
;
Purpose: sets the System time using interrupt 21h
;
function 2Dh
;
Calling Registers :
;
AH = 2D H
;
CH : Hours (0..23)
;
CL : Minutes (0..59)
;
DH : Seconds (0..59)
;
Return Registers :
;
AL = 00 if success to change the system time
;
usage : INUNDEC procedure in procfile.asm
;
update : 27/11/2000
;====================================================================
.MODEL SMALL

.STACK 100H
.DATA
LF EQU 0DH
CR EQU 0AH
PROMPT DB
LF,CR,'Enter The Hour(0..23) : $'
MSG_M
DB
LF,CR,'Enter The Minute(0..59) : $'
MSG_S
DB
LF,CR,'Enter The Second(0..59) : $'
MSGSUC DB
LF,CR,'Your time is changed.$'
MSGFAIL DB
LF,CR,'Your Time Is Not Changed.'
DB
LF,CR,'Do You Want To Try Again Y/N? $'
MSGINV DB
LF,CR,'Invalid Time...'
DB
LF,CR,'Do You Want To Try Again Y/N? $'
HOUR
DB
'?'
MINUTE DB
'?'
.CODE
MAIN PROC
MOV
AX,@DATA
MOV
DS,AX
begin :
; DISPLAY PROMPT MESSAGE
MOV
AH , 9
LEA
DX , prompt
INT
21H
; Read The Hour
CALL INUNDEC
MOV
HOUR , AL
CMP
AL , 23D
JG
begin
@minute:
MOV
AH , 9
LEA
DX , MSG_M
INT
21H
; Read the Minute
CALL INUNDEC
CMP
AL , 59D
JG
@minute
MOV
MINUTE , AL
@second :
MOV
AH,9
LEA
DX , MSG_S
INT
21H
; Read The Second
CALL INUNDEC
CMP
AL , 59D
JG
@second
; Set Time using Function 2Dh
MOV
DH , AL
; DH = Seconds
MOV
CL , MINUTE
; CL = Minutes
MOV
CH , HOUR
; CH = Hour
MOV
AH , 2DH
INT
21H
;IS DATE CHANGED ?
CMP
AL , 00H
JNE
AGAIN
MOV
AH , 9H
LEA
DX , MSGSUC
INT
21H
JMP
EXIT
again:
MOV
AH , 9H
LEA
DX , MSGFAIL

INT
21H
answer: ;ANSWER Y/N
MOV
AH , 1H
INT
21H
CMP
'AL , 'Y
JE
begin
CMP
'AL , 'y
JE
begin
CMP
'AL , 'n
JE
EXIT
CMP
'AL , 'N
JE
EXIT
JMP
ANSWER
exit:
MOV
AH , 4CH
INT
21H
MAIN ENDP
include procfile.asm
END
MAIN

:
A
(SVGA
AB8000h)ASCII
Attribute.


?ACZ(?)
9??
C.

:Write:
program
;displayrun
;uses crt,Dos
var
;hs, ms, ss, hunds,he, me, se, hunde : Word
;ch:char
;BX, Counter:integer
begin
;clrscr
;)TextColor(blue
;)TextBackground(white
;)GetTime(hs,ms,ss,hunds
FOR BX:= 1 TO 9 DO
for ch:='A' to 'Z' do
for counter :=1 to 2000 do
;)write(ch

GetTime(he,me,se,hunde);
writeln;
writeln('Started at ',hs,':',ms,':',ss,'.',hunds);
writeln('Finished at ',he,':',me,':',se,'.',hunde);
writeln('Run time is ',he-hs,':',me-ms,':',se-ss,'.',hunde-hunds);
repeat until keypressed;
end.

::
program
displayrun;
uses crt,Dos;
var
hs, ms, ss, hunds,he, me, se, hunde : Word;
ATRIB,ch:BYTE;
BX, Counter:integer;
begin
clrscr;
TextColor(blue);
TextBackground(white);
GetTime(hs,ms,ss,hunds);
ATRIB:=$17;
FOR BX:= 1 TO 9 DO
for ch:=65 to 90 do
for counter :=0 to 2000 do
BEGIN
MEM[$B800:2*COUNTER]:=CH;
MEM[$B800:2*COUNTER+1]:=ATRIB;
END;
{
write(ch);}
GetTime(he,me,se,hunde);
writeln;
writeln('Started at ',hs,':',ms,':',ss,'.',hunds);
writeln('Finished at ',he,':',me,':',se,'.',hunde);
writeln('Run time is ',he-hs,':',me-ms,':',se-ss,'.',hunde-hunds);
end.

::
TiTle Disp_asm : Fill The screen & Compute Runtime
.MODEL SMALL
.STACK 100H
.DATA
printCh
MSGS DB
Hs
DB
Ms
DB
Scs
DB
HSs
DB
MSGe DB
He
DB
Me
DB
Se
DB
HSe
DB
MSGR DB

dw '?'
0DH,0AH,'Start Time is
'?'
'?'
'?'
'?'
0DH,0AH,'Finish Time is
'?'
'?'
'?'
'?'
0DH,0AH,'Run
Time is

$'

$'

$'

.CODE
MAIN PROC
;initialization
MOV
AX , @DATA
MOV
DS , AX
; Get start time
MOV
AH,2CH
INT
21H
MOV
Hs , CH
MOV
Ms , CL
MOV
Scs , DH
MOV
HSs , DL
MOV
AX,0B800h
;color active display page
MOV
DS,AX
MOV
AH,17H
MOV
BX,9
DISPLAY_ALL:
MOV
AL,41h
AGAIN:
MOV
DI,0
MOV
CX,2000d
;fill active display page
FILL_BUF:
MOV
[DI],AX
ADD
DI,2
LOOP FILL_BUF
;loop until done
ADD
AX,01H
CMP
AL,'Z'
JLE
AGAIN
DEC
BX
JNZ
DISPLAY_ALL
; Get finish time
MOV
AX , @DATA
MOV
DS , AX
MOV
AH,2CH
INT
21H
MOV
He , CH
MOV
Me , CL
MOV
Se , DH
MOV
HSe , DL
; display start time
MOV
AH , 9
LEA
DX , MSGs
INT
21H
XOR
AX , AX
MOV
AL , Hs
CALL OUTDEC
MOV
DL , ':'
MOV
AH , 2
INT
21H
;
XOR
AX , AX
MOV
AL , Ms
CALL OUTDEC
MOV
DL , ':'
MOV
AH , 2
INT
21H
;
XOR
AX , AX
MOV
AL , Scs
CALL OUTDEC

MOV
LEA

CALL
MOV

MOV
DL , '.'
MOV
AH , 2
INT
21H
;
XOR
AX , AX
MOV
AL , HSs
CALL OUTDEC
MOV
DL , ':'
MOV
AH , 2
INT
21H
; display finish time
MOV
AH , 9
LEA
DX , MSGe
INT
21H
XOR
AX , AX
MOV
AL , He
CALL OUTDEC
MOV
DL , ':'
MOV
AH , 2
INT
21H
;
XOR
AX , AX
MOV
AL , Me
CALL OUTDEC
MOV
DL , ':'
MOV
AH , 2
INT
21H
;
XOR
AX , AX
MOV
AL , Se
CALL OUTDEC
MOV
DL , '.'
MOV
AH , 2
INT
21H
;
XOR
AX , AX
MOV
AL , Hse
CALL OUTDEC
MOV
DL , ':'
MOV
AH , 2
INT
21H
; display run time
AH , 9
DX , MSGR
INT
21H
XOR
AX , AX
MOV
AL , He
SUB
AL , Hs
OUTDEC
DL , ':'
MOV
AH , 2
INT
21H
XOR
AX , AX
MOV
AL , Me
SUB
AL , Ms
CALL OUTDEC
MOV
DL , ':'
MOV
AH , 2
INT
21H
XOR
AX , AX
MOV
AL , Se

AL , Scs
OUTDEC
'DL , '.
AH , 2
INT
21H
AX , AX
AL , HSe
AL , HSs
OUTDEC

SUB
CALL
MOV
MOV

XOR
MOV
SUB
CALL
; dos exit
MOV
AH,4CH
INT
21H
MAIN ENDP
Include procfile.asm
END MAIN

:
A. A
==

1 : Assembly Language Programming and Organization of the IBM PC

: Ytha YuCharless Marut


:

Mc-Graw-Hill

2- : DOS Programmers Reference

: Terry R. Dettmann
:

QUE

3- : Advanced Assembly Language

: Steven Holzer

-4

: Structured Computer organization

: TanenBaum

Brdy Publishing

Prentice-Hall

5- : 8038680486

:
:

You might also like