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
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
Name |
Code |
Decimal |
Add |
000000 |
(0d) |
Sub |
001010 |
(10d) |
Cmp |
001110 |
(14d) |
Mov |
100010 |
(34d) |
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)