Constructing
the Machine Codes
for
8086 Instructions
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 1
Instruction Templates
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 2
Coding Template for
MOV
Instruction
(Moving Data between registers or between a register
and a memory location)
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 3
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 4
The upper 6 bits of the first byte are an opcode and for
MOV it is 100010
The W bit in the first word is used to indicate whether a
byte or a word is being moved
If you are moving a byte, make W=0 ; if you are moving
a word, make W=1
If the instruction is moving data to the register identified
in the REG field, make D=1
If the instruction is moving data from that register, make
D=0
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 5
W=0 W=1
REGISTER CODE REGISTER CODE
AL 000 AX 000
CL 001 CX 001
DL 010 DX 010
BL 011 BX 011
AH 100 SP 100
CH 101 BP 101
DH 110 SI 110
BH 111 DI 111
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 6
SEGMENT REGISTERS
SEGMENT CODE
REGISTER
CS 01
DS 11
ES 00
SS 10
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 7
mod 00 01 10 11
R/M W=0 W=1
000 [BX]+[SI] [BX]+[SI]+d8 [BX]+[SI]+d16 AL AX
001 [BX]+[DI] [BX]+[DI] +d8 [BX]+[DI] +d16 CL CX
010 [BP]+[SI] [BP]+[SI]+d8 [BP]+[SI]+d16 DL DX
011 [BP]+[DI] [BP]+[DI]+d8 [BP]+[DI]+d16 BL BX
100 [SI] [SI]+d8 [SI]+d16 AH SP
101 [DI] [DI]+d8 [DI]+d16 CH BP
110 d16 (DIRECT [BP]+d8 [BP]+d16 DH SI
ADDRESS)
111 [BX] [BX]+d8 [BX]+d16 BH DI
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 8
MOV Instruction coding Examples
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 9
MOV SP, BX
Approach 1:
W=1
D = 1 ( Moving data to the register specified by
REG) and hence REG = 100
MOD ( for - from data i. e. BX) = 11
and corresponding R/M = 011
Final machine code: 1000101111100011
i. e. 8BE3
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 10
Approach 2:
W=1
D = 0 ( Moving data from the register specified by
REG) and hence REG = 011
MOD ( for - to data i. e. SP) = 11
and corresponding R/M = 100
Final Machine Code: 1000100111011100
i.e. 89DC
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 11
Assignments…
1. MOV CL, [BX]
2. MOV 43H[SI], DH
3. MOV CX, [437AH]
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 12
Instruction format for mov immediate
1100011w mod(2bits) 000 r/m(3bits) data data1(if w=1)
For mov ax, 1234h
11000111 11000000 34 12
C7C03412H
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 13
Instruction format for
mov REGISTER TO SEGMENT REG
10001110 MOD(2bits) 0 SEGREG (2) R/M(3)
MOV DS, AX
Machine Code: 10001110 11011000
i. e. 8ED8h
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 14
Instruction format for
mov SEGMENT REG TO REGISTER
10001100 MOD(2bits) 0 SEGREG (2) R/M(3)
MOV AX, DS
Machine code: 1000110011011000
i. e. 8CD8h
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 15
Writing Programs for use with an
Assembler
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 16
SEGMENT AND ENDS DIRECTIVES
To put a group of data items or group of
instructions in a particular segment
A group of data segments or a group of
instruction statements contained between
SEGMENT and ENDS directives is called a
logical segment
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 17
Naming Data and Addresses – EQU, DB,
DW and DD Directives
EQU Directive:
The EQU or equate directive is used to assign
names to constants used in programs
Example:
NUM EQU 07H
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 18
Advantage of using EQU directive at start of
programs is that if we want to modify the value
of NUM it is enough if we change only at one
place of declaration; it will reflect at all
occurrences of NUM in the pgm
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 19
DB, DW and DD Directives
DB takes 1 byte of memory location
Examples:
A DB 12H
Array DB 27H, 48H, 32H, 69H
C DB ?
? Signifies we don’t care about the initial value
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 20
DW (Word) takes 2 byte of memory location
DD (Double Word) takes 4 bytes of memory
location
Note: Refer Example Program multiply.asm
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 21
Multiply.asm
Data segment
a dw 204Ah
b dw 3B2Ah
c dw 2 dup (0)
Data ends
Code segment
assume cs:code, ds:data
Start: mov ax, data
mov ds, ax
mov ax, a
mul b
mov c, ax
mov c+2, dx
mov ah, 4ch
int 21h
Code ends
End start
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 22
Types of Numbers in Data Statements
BINARY:
Example:
MAX DB 01111001B
If you want to put in a negative binary no, write
the no in its 2’s complement sign-and-magnitude
form
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 23
DECIMAL:
Example:
MAX DB 49
If you specify a –ve no in a data declaration
statement, the assembler will convert it to 2’s
complement form
Example:
MIN DB -20
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 24
HEXADECIMAL:
A hexadecimal number is indicated by an H after the
hexadecimal digits
Example:
NUM1 DB 35H
Note:
A zero must be placed in front of a hex number that
starts with a letter
Example:
NUM2 DB 0F4H
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 25
BCD: (Binary Coded Decimal)
BCD uses a 4-bit binary code to individually
represent each decimal digit in a number
Uses the first 10 numbers of a standard binary
code for the BCD numbers 0 through 9
The hex codes A through F are invalid BCD
codes
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 26
To convert a decimal number to its BCD
equivalent, just represent each decimal digit by
its 4-bit binary equivalent
Decimal 5 2 9
BCD 0101 0010 1001
To convert a BCD number to its decimal
equivalent, reverse the process
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 27
BCD Addition:
1)
BCD
35 0011 0101
+23 + 0010 0011
58 0101 1000
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 28
2)
BCD
7 0111
+5 + 0101
12 1100 Incorrect BCD
+ 0110 Add 6
0001 0010 correct BCD 12
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 29
3)
BCD
9 1001
+8 + 1000
17 0001 0001 Incorrect BCD
0000 0110 Add 6
0001 0111 correct BCD 17
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 30
Note:
The reason for the correction factor 6 is that in
BCD we want a carry into the next digit after
1001 or 9, but in binary a carryout of the lower 4
bits doesn’t occur until after 1111 or 15.
The difference between the two carry points is to
produce the desired carry if the result of an
addition in any BCD is more than 1001
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 31
If you want the assembler to initialize a variable
with the value 37 BCD, we have to put an H after
the number
Example:
SECONDS DB 59H
This will initialize SECONDS with 0101 1001,
which is BCD representation of 59
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 32
ASCII:
We can declare a data structure (array)
containing a sequence of ASCII codes by
enclosing the letters or numbers after a DB in
single quotation marks
Example:
BOY1 DB ‘RAM’
Tells the assembler to declare a data item
named BOY1 that has 3 memory locations
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 33
It also tells the assembler to put the ASCII code
for R in the first memory location, ASCII code for
A in second memory location and ASCII code for
M in 3rd memory location
The assembler will automatically determine the
ASCII codes for the letters or numbers within the
quotes
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 34
Accessing Named Data with program
instructions
The assembler will automatically calculate the
displacement of the named data item from the
start of the segment and insert this value as part
of the binary code for the instruction
Example:
a dw 1234h
b db 23h
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 35
Naming Addresses - Labels
One type of name used to represent addresses
is called a label
Labels are written in the label field of an
instruction statement or a directive statement
One major use of labels is to represent the
destination for jump and call instructions
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 36
Example:
NEXT : IN AL, 05H
.
.
.
JMP NEXT
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 37
The ASSUME Directive
At any given time the 8086 works directly with
only four physical segments: a code segment, a
data segment, a stack segment and an extra
segment
The ASSUME directive tells the assembler
which logical segment to use for each of these
physical segments at a given time
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 38
For example, the statement
ASSUME CS:CODE, DS:DATA tells the
assembler that the logical segment named
CODE contains the instruction statements for
the program and should be treated as a code
segment
It also tells the assembler that it should treat the
logical segment DATA as data segment
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 39
If we are using stack segment and extra
segment in our program we need to include it in
ASSUME directive
Example:
SS : STACK and ES : EXTRA
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 40
Initializing Segment Registers
When the instructions are executed, the
displacements in the instructions will be added
to the segment base addresses represented by
the 16-bit numbers in the segment registers to
produce the actual physical addresses
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 41
The segment registers other than the code
segment register must be initialized by program
instructions before they can be used to access
data
If data segment represented by DATA then the
instructions for this are:
MOV AX, DATA
MOV DS, AX
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 42
If we use the stack segment and the extra
segment in a program, the stack segment
register and the extra segment register must be
initialized by program instructions in the same
way
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 43
The END Directive
Tells the assembler to stop reading the
assembly language code
Any instructions or statements that we write after
an END directive will be ignored
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 44
Assembly Language Program
Development Tools
We will probably want to use some type of
program development tools to make our work
easier
Most of these tools are programs which we run
to perform some function on the program we
are writing
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 45
Editor
Is a program which allows us to create a file
containing the assembly language statements
for our program
As we type in our program, the editor stores the
ASCII codes for the letters and numbers in
successive RAM locations
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 46
When we have typed in all our program, we then
save the file on hard disk
If we are going to use MASM assembler, we
should give the source file name the extension
.asm
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 47
Assembler
Translates the assembly language mnemonics
for instructions to the corresponding binary
codes
On the first pass through the source program,
the assembler determines the displacement of
named data items, the offset of labels etc and
puts this information in a symbol table
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 48
On the second pass through the source
program, the assembler produces the binary
code for each instruction and inserts the offsets,
etc that is calculated during first pass
The assembler generates two files on hard disk
The .obj file and .lst file
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 49
The .obj file i.e. object file contains the binary
codes for the instructions and information about
the addresses of the instructions
The .lst i.e. assembler list file consists of
assembly language statements, the binary
codes for each instruction and the offset for each
instruction
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 50
The assembler listing will also indicate any
typing or syntax errors we made in our source
program
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 51
Linker
A linker is a program used to join several object
files into one large object file
When writing large programs, it is usually much
efficient to divide the large program into smaller
modules
Each module can be individually written, tested
and debugged
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 52
When all the modules work, their object modules
can be linked together to form a large,
functioning program
The linker produces a link file which contains the
binary codes for all the combined modules
The linker also produces a link map file which
contains the address information about the
linked files
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 53
The MASM assemblers produce link files with
the .EXE extension
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 54
Locator
A locator is a program used to assign the
specific addresses of where the segments of
object code are to be loaded into memory
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 55
Debugger
A debugger is a program which allows you to
load our object code program into system
memory, execute the program and troubleshoot
or debug it
Allows us to look at the contents of registers and
memory locations after our program runs
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 56
A debugger also allows us to set a breakpoint at
any point in our program
If we insert a breakpoint, the debugger will run
the program up to the instruction where we put
the breakpoint and then stop execution
The debugger commands help us to quickly find
the source of a problem in our program
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 57
Emulator
Is a mixture of hardware and software
Is usually used to test and debug the hardware
and software of an external system, such as the
prototype of a microprocessor-based instrument
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 58
Like a debugger, an emulator allows us to load
and run programs, examine and change the
contents of registers, examine and change the
contents of memory locations and insert
breakpoints in the program
The emulator also takes a snapshot of the
contents of the registers, activity on the address
and data bus, and the state of the flags as each
instruction executes
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 59
Thank You..
6/30/2019 ROSHAN FERNANDES, DEPT OF CSE 60