Machine code instructions

Here is a simplified account of machine code instructions for the 8088. Each machine code instruction is chosen to be a multiple of 8, since that is how memory is stored. This makes the machine code more efficient. If instructions could be 7-bits or 11-bits, then space in the machine code is wasted.

Machine code instrucions are also chosen to be as short as possible. That is the reason for such a complicated conventional machine language for the 8088. Shorter instructions are executed faster. To be more reasonable, the designers would have to have added 1 or 2 bits to the instruction. But if 1 bit is added, then 1 byte is added, due to the way memory is accessed. So, space was saved at the expense of flexibility. This is why only certain registers can be used for addressing - only three bits were allowed in the instruction. If more registers were allowed for indirect memory references, then more bits would have to be added to the instruction. The code is found in the R/M field, described below. Here is a table that shows the relationship between bits in the machine code and addressing modes when making an indirect memory reference:

        Code        Indirect reference
        000         DS:[BX+SI+disp]
        001         DS:[BX+DI+disp]
        010         SS:[BP+SI+disp]
        011         SS:[BP+DI+disp]
        100         DS:[SI+disp]
        101         DS:[DI+disp]
        110         SS:[BP+disp]
        111         DS:[BX+disp]

Similarly, the reason that the segment registers are limited in their use, is due to the size of the field in the conventional machine language for specifying the register. This information is stored in the REG field, described below. There is also a bit, the W bit, which indicates if the access is to a byte or a word. A table representing which registers can be specified:

        Code        Register when W=1 Register when W=0   
        000         AX                  AL
        001         CX                  CL
        010         DX                  DL
        011         BX                  BL
        100         SP                  AH
        101         BP                  CH
        110         SI                  DH
        111         DI                  BH

The layout for a machine instruction

All machine instructions on the 8088 have a similar layout. There are instructions with no operands, 1 operand and 2 operands. They are similar, so only the 2 operand instructions will be considered here.There is space for the OPCODE, which tells what the instruction does. There are two fields for the operands. One operand is always a register, the other can be a register or memory. The register field is always first in the machine code instruction, so there is a bit to indicate if the register field is the source or the destination of the operation. There is also a bit to indicate if this is a byte or word operation. Optionally, there are extra bytes added for immediate values, direct memory addresses, or indirect memory displacements. Here is a simplified layout

OP        6 bits         Indicates the operation being performed
Dest      1 bit          A 1 indicates the the register operand is the destination
W         1 bit          A 1 indicated that the operation is on words
Mod       2 bits         Indicates what the second operand is:
                    00   direct or indirect memory reference     
                    01   indirect memory reference with a byte displacement
                    10   indirect memory reference with a word displacement
                    11   operand is a register
Reg       3 bits         indicates which register is being used
R/M       3 bits         used with MOD to indicate what the second operand is,
                         R/M stands for register or memory

A few op codes

Name

Code

Decimal

Add

000000

(0d)

Sub

001010

(10d)

Cmp

001110

(14d)

Mov

100010

(34d)

Some examples using the ADD instruction

03 1E 0000 R        ADD  BX,NUM
000000 11 00 011 110

OP   000000 Add
Dest 1      Reg operand is destination
Word 1      Working on words
Mod  00     Mod=00 and Mem=110 means memory direct
Reg  011    BX
R/M  110    Mod=00 and Mem=110 means memory direct

01 1E 0000 R             ADD  NUM,BX
000000 01 00 011 110

OP   000000 Add
Dest 0      Reg is source
Word 1      Working on words
Mod  00     Mod=00 and Mem=110 means memory direct
Reg  011    BX
R/M  110    Mod=00 and Mem=110 means memory direct
0000 R      Offset to NUM, relocatable

03 D3               ADD  DX,BX
000000 11 11 010 011

OP   000000 ADD
Dest 1      Reg is destination
Word 1      Working on words
Mod  11     reg to reg
Reg  010    DX
R/M  011    BX

03 17               ADD  DX,[BX]
000000 11 00 010 111

OP   000000 Add
Dest 1      Reg is destination
Word 1      Working on words
Mod  00     Mod=00 and Mem=111 means memory indirect,
            no displacement
Reg  010    DX
R/M  111    DS:[BX+disp], disp is 0 here

03 57 02    ADD     DX,[BX+2]
000000 11 01 010 111

OP   000000 Add
Dest 1      Reg is destination
Word 1      Working on words
Mod  01     Mod=01 means memory indirect for 8 bit displacement
Reg  010    DX
R/M  111    DS:[BX+disp], disp is 2 here
02          Displacement

02 97 80 00 ADD     DL,[BX+128]
000000 10 10 010 111

OP   000000 Add
Dest 1      Reg is destination
Word 0      Working on words
Mod  10     Mod=10 means memory indirect for 16 bit displacement
Reg  010    DX
R/M  111    DS:[BX+disp], disp is 128 here
80 00       Displacement (byte swapped)