Assembly
Assembly
EBCDIC BCD
BIT
NIBBLE
BYTE
WORD
DOUBLEWORD
QUADWORD
KILOBYTE
MEGABYTE
GIGABYTE
TERABYTE
ROM
RAM
CPU
Cpu
Pentium
pentium 80486 80386 80286 8086
Pro
1M
16
16
20
16M
16
16
24
4G
32
32
32
4G
32
32
32
4G
32
64
32
64G
32
64
36
8086
CS
ES
SS
AL
AH
BL
BH
CL
CH
DL
DH
DS
BP
IP
DI
SI
SP
OPERAND
ALU
FLAGS
)AX,BX,CX,Dx (AH,AL,
CS , DS , SS , ES
()
SP
FR
DI
,
BP
SI
IP ,
AX
BX
CX
DX
.
CH
CL
CX
BH
BL
AH
AL
AX
BX
DH
DL
DX
16
64
:
() DS
()SS
() ES
() CS
FLAG
16 .
CF
PF
CF
PF
AF
ZF
SF
TF
IF
DF
OF
AF
SF ZF
TF
OF DF IF
4
] ;[] [ ] [
:
MOV AL,BL
MOV
MOV destination, source
MOV CL,55H
MOV AH,DL
MOV AX,BX
MOV SI,DI
DS SS ES CS
MOV SS,2345H
MOV AX,2345H
MOV SS,AX
FF
MOV BX,5H
MOV BL,7F2H
MOV AX,2FE456H
ADD
ADD destination, source
Mov AL,25H
MOV BL,34H
ADD AL,BL
MOV DH,25H
ADD DH,34H
:
MOV BH,38H
ADD BH,2FH
38 0011 1000
2F 0010 1111
---- -------------67 0110 0111
CF=0 PF=0 AF=1 zf=0 SF=0
8086
A32FFH
00000H FFFFFH
64K
0000H FFFFH
EF32
2500:95F3
:
2500
25000+95F3=2E5F3H
()
CS IP
CS:IP .
: CS=24F6H IP=634AH:
-
-
-
-
-
DS
BX DI
SI .
:
]ADD AL,[BX
8 16
.
:
MOV AX,35F3H
MOV [1500],AX
F3
DS:1500
35
DS:1501
:
DS:6826=48H
DS:6827=22H
BX ] MOV BX,[6826
.
STACK
RAM CPU
.
SS SP .
sp
.
:
SP:=1236H
AX=24B6
DI=85C2
DX=5F93
.
PUSH AX
PUSH DI
PUSH DX
SS:1230
93
SS:1231
5F
SS:1232
C2
C2
85
85
B6
B6
B6
24
24
24
PUSH DI
PUSH DX
SS:1233
SS:1234
SS:1235
SS:1236
START
PUSH AX
.
: sp=18FA
POP CX
POP DX
POP BX
SS:18FA
SS:18FB
SS:18FC
SS:18FD
SS:18FE
SS:18FF
23
14
6B
6B
2C
2C
91
91
91
F6
F6
F6
POP CX
POP DX
SP=18FC
CX=1423
SP=18FE
DX=2C6B
SS:1900
START
POP BX
SP=1900
BX=F691
MOV BX,DX
MOV ES,AX
ADD AL,BH
DS
FLAG
MOV AX,2550H
MOV CX,635
MOV BL,40H
.
DS .
]MOV DL,[2400
:
DS=1512H
MOV AL,99H
MOV [3518],AL
. SI
DI BX
DS
]MOV AL,[BX
]MOV CL,[SI
MOV [DI],AH
MOV [SI],AX
BX BP
MOV CX,[BX]+10
DI SI
.
MOV DX,[SI]+5
MOV CL,[DI]+20
.
MOV CL,[BX][DI]+8
MOV CH,[BX][SI]+20
MOV AH,[BP][DI]+12
()
] MOV AX,[BX DS:BX
]MOV AX,ES:[BX
:
]MOV AX,CS:[BP
IP
SI,DI,BX
SI,DI,BX
CS
DS
ES
SP,BP
SS
DS
] [
DS
][BX],[SI],[DI
DS
SS
, [BP]+[BX]+
DS
DS
, [SI]+[DI]+
DS
DS
SS
[BX][SI]+
[BX][DI]+
[BP][SI]+
Label SEGMENT [options]
Label ENDS
STACK _ SEG
SEGMENT
STACK _ SEG
DATA _ SEG
ENDS
SEGMENT PARA
DATA
DATA _ SEG ENDS
EXTRA _ SEG SEGMENT PARA EXTRA
EXTRA _ SEG
ENDS
CODE _ SEG SEGMENT PARA CODE
CODE _ SEG
ENDS
DB
.
DATA1 DB 25
DATA2 DB 10001001B
DATA3 DB 12H
DATA4 DB 2591
? DATA5 DB
DUP
)DATA DB 6DUP(12H
)?(DATA DB 32DUP
))DATA DB 5DUP(2DUP(99
DW
DATA1 DW 954
DATA2 DW 1001010100B
DATA3 DW 253FH
DATA4 DW 9,2,7,0CH,00100000B,HI
)?(DATA5 DW 8DUP
DD
DATA DD 1023
DATA1 DD 100010010110010111000B
DATA2 DD 5C2A57F2H
DATA3 DD 23H,24789H,65533
DQ
DATA20 DQ 4523C2H
DATA1 DQ HI
? DATA2 DQ
EQU
.
COUNT EQU 25
ORG
.
ORG 0030H
TITLE PROG3
PAGE 60,132
STSEG SEGMENT
DB 32 DUP(?)
STSEG ENDS
DTSEG SEGMENT
ORG 10H
DATA_IN DB 25H.4FH,85H,1FH,2BH,C4H
ORG 28H
COPY DB 6 DUP(?)
DTSEG ENDS
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG
MOV AX,DTSEG
MOV DS,AX
MOV SI,OFFSET DATA_IN
MOV DI,OFFSET COPY
MOV CX,06H
MOV_LOOP: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CX
JNZ MOV_LOOP
MOV AH,4CH
INT 21H
MAIN ENDP
CDSEG ENDS
END MAIN
STSEG SEGMENT
DB 32 DUP(?)
STSEG ENDS
DTSEG SEGMENT
DATA_IN DW 234DH,1DE6H,3BC7H,566AH
ORG 10H
SUM DW ?
DTSEG ENDS
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG
MOV AX,DTSEG
MOV DS,AX
MOV CX,04
MOV DI,OFFSET DATA_IN
MOV BX,00
ADD_LP: ADD BX,[DI]
INC DI
INC DI
DEC CX
JNZ ADD_LP
MOV SI,OFFSET SUM
MOV [SI],BX
MOV AH,4CH
INT 21H
MAIN ENDP
CDSEG ENDS
END MAIN
PAGE 60,132
TITLE SAMPLEPROG
STSEG SEGMENT
DB 32 DUP(?)
STSEG ENDS
DTSEG SEGMENT
DATA_IN DB 25H,12H,15H,1FH,2BH
SUM DB ?
DTSEG ENDS
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG
MOV AX ,DTSEG
MOV DS,AX
MOV CX,05
MOV BX,OFFSET DATA_IN
MOV AL,0
AGAIN: ADD AL,[BX]
INC BX
DEC CX
JNZ AGAIN
MOV SUM,AL
MOV AH,4CH
INT 21H
MAIN: ENDP
CDSEG ENDS
END MAIN
NEG
(
MOV AL,100
NEG AL
NOT
(
)
MOV AL,05H
NOT AL
LEA
SUB
:
( )
SUB destination, source
Destination=destination-source
: CF
CF=0 CF=1
( )
.
: AL
CF ZF PF AF SF
MOV AL,3FH
MOV BH,23H
SUB AL,BH
:
MOV AL,3FH
MOV BH,23H
SUB BH,AL
SBB
: CF=0
SUB CF=1
: CF=1 AL=95H BL=4F
SBB AL,BL
:
DATA_A DD 62562FAH
DATA_B DD 412963BH
RESULT DD ?
.
MOV AX,WORD PTR DATA_A
SUB AX,WORD PTR DATA_B
MOVE WORD PTR RESULT,AX
MOV AX,WORD PTR DATA_A+2
SBB AX,WORD PTR DATA_B+2
MOVE WORD PTR RESULT+2,AX
ADC
.
ADC AH,BL
:
AH=AH+BL+CF
X
DD
45ED23AF
Y
DD
6785FF23
Z
DD
?
MOV
AX ,WORD PTR X
ADD
AX , WORD PTR Y
MOV WORD PTR Z , AX
MOV
AX ,WORD PTR X + 2
ADC
AX , WORD PTR Y + 2
MOV
WORD PTR Z + 2 , AX
:
.
DTSEG SEGMENT
DATA1 DQ 548FB9963CE7H
DATA2 DQ 3FCD4FA23B8DH
DATA3 DQ ?
SEGMENT
.
CLC
MOV SI,OFFSET DATA1
MOVE DI,OFFSET DATA2
MOVE BX,OFFSET DATA3
MOV CX,04
LOOP BACK
.
) )MUL
AL
AX
AH=0,AL
AX
DX:AX
DX:AX
:1
RESULT DW ?
.
MOV AL,25H
MOV BL,65H
MUL BL
MOV RESULT,AX
:
DATA3 DW 2378H
DATA4 DW 2F79H
RESULT1 DW 2 DUP(?)
.
MOV AX,DATA3
MUL DATA4
MOV RESULT1,AX
MOV RESULT1+2,DX
DATA5 DB 6BH
DATA6 DW 12C3H
RESULT3 DW 2 DUP(?)
.
MOV AL,DATA5
SUB AH,AH
MUL DATA6
MOV BX,OFFSET RESULT3
MOV [BX],AX
MOV [BX]+2,DX
DATA1 DB 25H
DATA2 DB 65H
RESULT DW ?
..
MOV AL,DATA1
MOV SI,OFFSET DATA2
MUL BYTE PTR [SI]
MOV RESULT,AX
DIV
AH=0,AX
AL
AH
=DX=0,AX
AX
DX
=AX
AL
AH
AX
DX
=DX:AX
MOV AL,95
SUB AH,AH
DIV 10
MOV Q,AL
MOV R,AH
AND
AND
MOV BL,35H
AND BL,0FH
AND CF OF .
AND
AND AL,AL
JZ WER
.
WER: ..
OR
OR
MOV BL,35H
OR BL,0FH
OR CF OF
OR
OR BL,0
OR BL,BL
XOR
XOR
MOV BL,35H
XOR BL,0FH
XOR CF OF
XOR
XOR AH,BL
XOR
XOR BH,06H
SHR
CF
.
CL .
CF
LSB
MSB
:
MOV AL,9AH
MOV CL,3
SHR AL,CL
:
MOV BX,FFFFH
SHR BX,1
:
DATA1 DW 7777H
TIMES EQU 4
MOV CL,TIMES
SHR DATA1,CL
SHL
SHR
LSB
MSB
CF
:
MOV DH,6
MOV CL,4
SHL DH,CL
JMP
JMP goto .
JMP LABEL
-128 127 ( IP
).
:
JMP L1
..
..
L1:..
LABEL:..
..
..
JMP LABEL
IF
. :
ZF = 1
ZF = 0
Je
Jz
Jne
Jnz
SF = 1
Js
SF = 0
Jns
CF = 1
Jc
CF = 0
Jnc
PF = 1
Jp
Jpe
PF = 0
Jnp
Jpo
OF = 1
Jo
OF = 0
Jno
CMP .
:
CMP OPR1 , OPR2
CMP SUB
.
AX , 100
CMP
CMP
:
JA
JNBE
JAE
JNB
JB
JNAE
JBE
JNA
CF=0,ZF=0
CF=0
CF=1
ZF=1 CF=1
CMP
:
JG
JNLE
SF=OF,ZF=0
JGE
JNL
JL
JNGE
JLE
SF=OF
SF<>OF
ZF =1 SF<>OF
:
CMP AL,61H
JB NEXT
CMP AL,7AH
JA NEXT
AND AL,DFH
NEXT: MOV [SI],AL
. CX
LOOP .
:
MOV CX , 10
LABI : .......
..........
. ........
LOOP LAB1
.
LOOP CX
. CX .
JCXZ
JCXZ .
CX
.
MOV
CX , 50
LABI: .......
..............
..............
DEC
CX
JCXZ
LABEND
JMP
LABI
LABEND:
LOOPNZ , LOOPZ
LOOPNZ , LOOPZ LOOP
CMP .
CX LOOPNZ
.
CX LOOPZ
.
:
MOV
FOR :
CX , 10
.
.
.
BX , 0
FOR
CMP
LOOPNZ
ROR
ROL
RCR
RCL
ROR
.
CF
:
MOV AL,36H
ROR AL,1
ROR AL,1
:
MOV BX,C7E5H
MOV CL,6
ROR BX,CL
ROL
CF
MSB -----------LSB
CF
MOV BH,72H
ROL BH,1
:
MOV DX,672AH
MOV CL,3
ROL DX,CL
DATA1 DB 97H
COUNT DB ?
.
SUB BL,BL
MOV DL,8
MOV AL,DATA1
AGAIN:ROL AL,1
JNC NEXT
INC BL
NEXT: DEC DL
JNZ AGAIN
MOV COUNT,BL
RCR
.
CF
MSB------------ LSB
:
CLC
MOV AL,26H
RCR AL,1
:
STC
MOV BX,37F1H
MOV CL,5
RCR BX,CL
RCL
CF
STC
MOV BL,15H
RCL BL,1
CLC
MOV AX,191CH
MOV CL,5
RCL AX,CL
BCD
BCD
BCD
0000 0
0001 1
0010 2
0011 3
0100 4
5
6
7
8
9
0101
0110
0111
1000
1001
BCD
BCD :
.
: 5 00000101
BCD :
.
: 59 01011001
BCD,ASCII
BCD
00000000
0110000
30
00000001
0110001
31
00000010
0110010
32
00000011
0110011
33
00000100
0110100
34
00000101
0110101
35
00000110
0110110
36
00000111
0110111
37
00001000
0111000
38
00001001
0111001
39
BCD
.
ASC DB 9562481273
ORG 0010H
UNPACK DB 10 DUP(?)
..
MOV CX,5
MOV BX,OFFSET ASC
MOV DI,OFFSET UNPACK
AGAIN:MOV AX,WORD PTR [BX]
AND AX,0F0FH
MOV WORD PTR [DI],AX
ADD DI,2
ADD BX,2
LOOP AGAIN
BCD
.
VAL_ASC DB 47
VAL_BCD DB 2DUP(?)
BCD
VAL1_BCD DB 29H
VAL3_ASC DW ?
..
MOV AL,VAL1_BCD
MOV AH,AL
AND AX,F00FH
MOV CL,4
SHR AH,CL
OR AX,3030H
XCHG AH,AL
MOV VAL3_ASC,AX
BCD
ADD BCD
:
MOV AL,17H
ADD AL,28H
3FH BCD 45
. 06
:
MOV AL,87H
ADD AL,52H
D9 BCD . 60
DAA Logic
If (AL(lo) > 9) or (AuxCarry = 1)
AL = AL + 6
AuxCarry = 1
If AL = AL + 6 sets the
Carry flag, its value is
Else
used when evaluating
AuxCarry = 0
AL(hi).
Endif
If (AL(hi) > 9) or Carry = 1
AL = AL + 60h
Carry = 1
Else
Carry = 0
Endif
106
DAA
6
6
ADD ADC 9
AF=1 0110
9 CF=1
0110 .
: 29H 18H AF=1
0110 .
:
DATA1 DB 47H
DATA2 DB 25H
DATA3 DB ?
.
MOV AL,DATA1
MOV BL,DATA2
ADD AL,BL
DAA
MOV DATA3,AL
DAA Examples
Example: calculate BCD 35 + 48
mov al,35h
add al,48h
daa
; AL = 7Dh
; AL = 83h, CF = 0
; AL = 9Ah
; AL = 00h, CF = 1
; AL = 92h
; AL = 98h, CF = 0
109
BCD
BCD
DAS
SUB SBB 9
AF=1 0110
9 CF=1 0110
.
DAS Logic
If (AL(lo) > 9) OR (AuxCarry = 1)
AL = AL 6;
AuxCarry = 1;
If AL = AL - 6 sets the
Else
Carry flag, its value is
AuxCarry = 0;
used when evaluating AL
Endif
If (AL > 9FH) or (Carry = 1)
AL = AL 60h;
Carry = 1;
Else
Carry = 0;
Endif
in the second IF
statement.
111
BUD DT 87965141012
EXP DT 31610640392
BAL DT ?
..
MOV CX,11
MOV BX,00
CLC
BACK: MOV AL,BYTE PTR BUD[BX]
SBB AL,BYTE PTR EXP[BX]
DAS
MOV BYTE PTR BAL[BX],AL
INC BX
LOOP BACK
DAS Examples (1 of 2)
Example: subtract BCD 48 35
mov al,48h
sub al,35h
das
; AL = 13h
; AL = 13h CF = 0
; AL = 2Dh, CF = 0
; AL = 27h, CF = 0
; AL = 09h, CF = 0
; AL = 03h, CF = 0
113
DAS Examples (2 of 2)
Example: subtract BCD 32 39
mov al,32h
sub al,39h
das
; AL = F9h, CF = 1
; AL = 93h, CF = 1
Steps:
AL = F9h
CF = 1, so subtract 6 from F9h
AL = F3h
F3h > 9Fh, so subtract 60h from F3h
AL = 93h, CF = 1
114
ASCII Decimal
A number using ASCII Decimal
representation stores a single ASCII digit in
each byte
For example, 5,678 is stored as the following
sequence of hexadecimal bytes:
35 36 37 38
115
AAA Instruction
The AAA (ASCII adjust after addition)
instruction adjusts the binary result of an ADD
or ADC instruction. It makes the result in AL
consistent with ASCII decimal representation.
The Carry value, if any ends up in AH
ah,0
al,'8'
al,'2'
ax,3030h
;
;
;
;
AX
AX
AX
AX
=
=
=
=
0038h
006Ah
0100h (adjust result), CF=1
3130h = '10'
116
AAS Instruction
The AAS (ASCII adjust after subtraction)
instruction adjusts the binary result of an SUB or
SBB instruction. It makes the result in AL
consistent with ASCII decimal representation.
It places the Carry value, if any, in AH
;
;
;
;
AX
AX
AX
AL
=
=
=
=
0038h
00FFh
FF09h, CF=1
'9'
117
AAM Instruction
The AAM (ASCII adjust after multiplication)
instruction adjusts the binary result of a MUL
instruction. The multiplication must have been
performed on unpacked BCD numbers.
mov bl,05h
mov al,06h
mul bl
aam
;
;
;
;
first operand
second operand
AX = 001Eh
AX = 0300h
118
BIOS DOS
INT
. INT
INT xx
Xx 00 FF
256
. 06H INT 10H
MOV AH,06
MOV AL,00
MOV BH,07
MOV CH,00
MOV CL,00
MOV DH,24
MOV DL,79
INT 10H
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
INT 10H 02
.
MOV AH,02
MOV BH,00
MOV DL,25
MOV DH,15
INT 10H
INT 10H 03
DH
DL
MOV AH,03
MOV BH,00
INT 10H
INT 21H 09 ASCII
DATA_ASC DB THE EARTH, $
.
MOV AH,09
MOV DX,OFFSET DATA_ASC
INT 21H
INT 21H 02
MOV AH,02
MOV DL,J
INT 21H
INT 21H 0AH
.....
)DATA1 DB 6DUP(FF
..
MOV AH,0AH
MOV DX,OFFSET DATA1
INT 21H
PROCEDURE
.
.
.
.
.
.
.
PROC ENDP
.
NEAR
FAR
.
.
INITIALIZE
NEAR
PROC
.
.
.
INITIALIZE
ENDP
:
CALL
INITIALIZE
POPFPUSHF
PUSH pop
flag
PUSHF
POPF
CDSEG SEGMENT
MAIN PROC FAR
.
CALL ASC
..
ENDP
ASC PROC
..
.
ASC ENDP
OF :
CF=0
CF=1
CF=1
OF=0
:
MOV AL,96
MOV BL,70
ADD AL,BL
:
MOV AL,-2
MOV CL,-5
ADD CL,AL
:
MOV AL,-120
MOV BL,-10
ADD AL,BL
:
MOV AL,92
MOV BL,89
ADD AL,BL
16 OF
CF=0
CF=1
CF=1
OF=0
:
MOV AX,6E2FH
MOV CX,13D4H
ADD AX,CX
:
MOV DX,542FH
MOV BX,12E0H
ADD DX,BX
CBW AH
AL
AH
CWD DX
AX
DX
MOV AX,260
CWD
MOV AL,-2
CBW
DATA1 DB 96
DATA2 DB 70
RESULT DW ?
.
SUB AH,AH
MOV AL,DATA1
MOV BL,DATA2
ADD AL,BL
JNO OVER
MOV AL,DATA2
CBW
MOV BX,AX
MOV AL,DATA1
CBW
ADD AX,BX
OVER: MOV RESULT,AX
IDIV
CBW =AL
AL
AH
CWD=AX
AX
DX
AX
AL
AH
DX:AX
AX
DX
SIGN_DAT DB +13,-10,+19,+14,-18
AV DW ?
RE DW ?
..
MOV CX,5
SUB BX,BX
MOV SI,OFFSET SIGN_DAT
BACK: MOV AL,[SI]
CBW
ADD BX,AX
INC SI
LOOP BACK
MOV AL,5
CBW
MOV CX,AX
MOV AX,BX
CWD
IDIV CX
MOV AV,AX
MOV RE,DX
IMUL
AL
AX
AX
DX:AX
DX:AX
CBW=AL
SAR
CF
MSB----------- LSB
MSB
:
MOV AL,-10
SAR AL,1
SAR 2
:
MOV AX,-9
MOV BL,2
IDIV BL
MOV AX,-9
SAR AX,1
SHL SAL
NEG
(
MOV AL,100
NEG AL
NOT
(
)
MOV AL,05H
NOT AL