
Internal memory on an IBM
mainframe is organized as a sequential collection of bytes. The bytes are numbered starting with 0 as
pictured below,

The IBM System 370
architecture allows an address to be expressed as a collection of 31
consecutive bits. The smallest address
would be represented by 31 consecutive 0’s which denotes address 0. The largest address would be represented by
31 consecutive 1’s whose value is 231 - 1 = 2,147,483,647. If we work with addresses in this form (lets
call these direct addresses), each address occupies a fullword - 4 bytes.
Why do we need an address in the first place? Consider
the following instruction,
MVC COSTOUT,COSTIN
In order for the machine to
move the contents of COSTIN to COSTOUT, it must know the locations of these two
fields. The computer identifies a field
by the address of the first byte in the field.
When an instruction is assembled, the assembler converts any symbols
like “COSTOUT” to their corresponding addresses. The assembler does not, however, generate direct addresses, but
produces an address in base / displacement format. Addresses in this form consist of 4
hexadecimal digits or two bytes, BDDD, where B represents a base register and
DDD represents a displacement. The
smallest displacement is x’000’ = 0 and the largest displacement is x’FFF’ =
4095. Ultimately, the base /
displacement address must be converted to a direct address. How does this occur? The diagram below indicates how this process
takes place starting with the base/displacement address x’8003’.

Notice that the effective
address, which is the direct address equivalent to the base/displacement
address, is computed by adding the contents of the base register with the
specified displacement.
Effective address
= Contents( Base Register)
+ Displacement
There are two advantages of using base/displacement addresses
instead of direct addresses in the object code that the assembler produces:
1) Every address is
shorter. Instead of being 4 bytes long,
the addresses are only 2 bytes.
2) The base/displacement
addresses are correct no matter where the program is loaded in
memory. Each
symbol is represented by a displacement from a fixed point inside the
program. If the
program is relocated in memory, the displacement to a given variable does
not change. The
base register remains fixed as well. As
a result, the base/displacement
address is correct.
On the other hand, if we had used direct addresses, every symbol
would have a new address if the program were relocated.