INTRODUCTION
as the base, the logical address can be made
up
of
many different types
of
values: it can be
just the immediate
data
value contained in
the instruction, or, it can be the sum of
an
immediate data value, plus a base register,
plus
an
index register.
For
the sum
of
the addition to be 20-bits
wide, the segment register value
is
automati-
cally shifted left
by
four binary bits before it
is
added to the 16-bit logical address. The
result
is
always 20-bits
of
physical address.
Note that since logical addresses are always
l6-bits wide, you can address up to
64,000
bytes in
a.
given segment without changing
the value of the segment base register. In sys-
tems that do not have more than
64,000 bytes
of program plus
64,000
of
stack, plus 64,000
bytes in each of two different data areas, it
is
possible to set the segment registers
at
the
beginning of the program and then forget
them. In a system where the
total amount
of
memory
is
64,000 bytes or less,
it
is possible
to set all segment registers equal and have
fully overlapping segments.
On
the other hand, segment registers are very
useful when you have a large programming
task and you want isolation between. your
program code and the
data
area or isolation
between module data and the stack informa-
tion,
etc. Segmentation also makes it easy to
build relocatable
and/
or reentrant programs.
RELOCATABLE AND REENTRANT
PROGRAMS
In
many cases, the task
of
relocating
an
8088
program (relocation means having the ability
to
run
the same program in several different
areas
of
memory without changing' the pro-
gram
itself) simply requires moving the
program code and then adjusting
of
the code
segment register
to
point to the base of the
new code area.
Since programs can be writ-
ten for the
8088
where branches
or
jumps in
program flow may occur using new locations
1-7
relative only to the instruction pointer, the
program does not care what value
is
kept in
the code segment regis
teL
figure
1-13
shows
how
an
entire process, consisting
of
code,
stack and data areas, can
be
relocated.
Likewise in a
reentrant program, a single
program uses multiple data areas. Before the
reentrant code
is
entered the second time, the
data segment register value
is
changed so
that
a different
data
area
is
made available to the
program.
ADDRESSING MODES
Now, let's continue our discussion of address-
ing modes, providing more detail about how
addresses are formed.
The
8088
has
24
different addressing modes'
to generate logical addresses. Figure 1-14'
shows the different logical addresscombina-
tions, from the simplest immediate data
mode
to
the register addressing mode, where
a selected register contains the
data
being
used
by
the instruction. In the direct address-
ing mode, the instruction itself contains the
address
of
the data. In the register indirect
mode, the instruction points
to
a register con-
taining the memory address
of
the desired'
data. There are both indexed and based
addressing m()des where the contents of
an
index
Or
based register
is
added to
an
imme-
diate
data
value contained in the instruction
to
form
the
memory
address.
Exactly
how
the
8088
selects an addressing
mode for a given instruction
is
encoded
within the bits
of
the instruction code. This
is
discussed
in
more detail in Chapter
2.
If
we
examine the most complex and power-
ful of the addressing modes, which includes
base register, index register, and displace-
ment in
the
logical address,
it
can be seen that
some fairly complex
data
structures can be
easily addressed in a single instruction by the
8088.