             All the following addressing modes can be used with or
             without a constant:

                 variable_name  (+constant)
                 [bx]     (+constant)
                 [si]     (+constant)
                 [di]     (+constant)
                 [bp]     (+constant)
                 [bx+si]  (+constant)
                 [bx+di]  (+constant)
                 [bp+si]  (+constant)
                 [bp+di]  (+constant)
             
             What about pointers? The natural segment for anything with [bp]
             is SS, the stack segment.{1}  Everything else has DS as its
             natural segment. The natural segments are:

                 (1) DS

                      variable + (constant)
                      [bx] + (constant)
                      [si] + (constant)
                      [di] + (constant)
                      [bx+si] + (constant)
                      [bx+di] + (constant)


                 (2) SS

                      [bp] + (constant)
                      [bp+si] + (constant)
                      [bp+di] + (constant)
             
As a quick review before going on, these are the legal ways to
address a variable on the 8086:

                 (1) by name.

                           mov  dx, variable1

                 It is also possible to have name + constant.

                           mov  dx, variable1 + 27

                 The assembler will resolve this into a single offset number
                 and will give the appropriate information to the linker.

                 (2) with the single pointers BX, SI, DI and BP (which are
                 enclosed in square brackets).

                           mov  cx, [si]
                           xor  al, [bx]
                           add  [di], cx
                           sub  [bp], dh

                 (3) with the single pointers BX, SI, DI and BP (which are
                 enclosed in square brackets) plus a constant.

                           mov  cx, [si+421]
                           xor  al, 18+[bx]
                           add  93+[di]-7, cx
                           sub  (54/7)+81-3+[bp]-19, dh

                 (4) with the double pointers [bx+si], [bx+di], [bp+si],
                 [bp+di]  (which are enclosed in square brackets).

                           mov  cx, [bx][si]
                           xor  al, [di][bx]
                           add  [bp]+[di], cx
                           sub  [di+bp], dh

                 (5) with the double pointers [bx+si], [bx+di], [bp+si],
                 [bp+di]  (which are enclosed in square brackets) plus a
                 constant.

                           mov  cx, [bx][si+57]
                           xor  al, 45+[di+23][bx+15]-94
                           add  [bp]+[di]-444, cx
                           sub  [6+di+bp]-5, dh

             These are ALL the addressing modes allowed on the 8086. As for
             the constants, it is the ASSEMBLER'S job to resolve all numbers
             in the expression into a single constant. If your expression
             won't resolve into a constant, it is between you and the
             assembler. It has nothing to do with the 8086 chip. 
