When writing large 16-bit programs, which must be split into multiple segments, it is
often necessary to be able to refer to the segment part of the address of a symbol. NASM
supports the SEG
operator to perform this function.
The SEG
operator returns the preferred segment base of a symbol, defined as the
segment base relative to which the offset of the symbol makes sense. So the code
mov ax, seg symbol mov es, ax mov bx, symbol
will load es:bx
with a valid pointer to the symbol symbol
.
Things can be more complex than this: since 16-bit segments and groups may overlap,
you might occasionally want to refer to some symbol using a different segment base from
the preferred one. NASM lets you do this, by the use of the WRT
(With Reference To) keyword. So you can do things like
mov ax, weird_seg ; weird_seg is a segment base mov es, ax mov bx, symbol wrt weird_seg
to load es:bx
with a different, but functionally
equivalent, pointer to the symbol symbol
.
NASM supports far (inter-segment) calls and jumps by means of the syntax call segment:offset
, where segment
and offset
both represent immediate values. So to call a far
procedure, you could code either of
call (seg procedure):procedure call weird_seg:(procedure wrt weird_seg)
(The parentheses are included for clarity, to show the intended parsing of the above instructions. They are not necessary in practice.)
NASM supports the syntax call far procedure
as a synonym
for the first of the above usages. JMP
works identically to
CALL
in these examples.
To declare a far pointer to a data item in a data segment, you must code
dw symbol, seg symbol
NASM supports no convenient synonym for this, though you can always invent one using the macro processor.