The SECTION
directive (((SEGMENT
)) is an
exactly equivalent synonym) changes which section of the output file the code you write
will be assembled into. In some object file formats, the number and names of sections are
fixed; in others, the user may make up as many as they wish. Hence SECTION
may sometimes give an error message, or may define a new
section, if you try to switch to a section that does not (yet) exist.
The Unix object formats, and the bin
object format, all
support the standardised
section names .text
, .data
and
.bss
for the code, data and uninitialised-data sections. The
obj
format, by contrast, does not recognise these section
names as being special, and indeed will strip off the leading period of any section name
that has one.
The SECTION
directive is unusual in that its user-level
form functions differently from its primitive form. The primitive form, [SECTION xyz]
, simply switches the current target section to the one
given. The user-level form, SECTION xyz
, however, first
defines the single-line macro __SECT__
to be the primitive [SECTION]
directive which it is about to issue, and then issues it. So
the user-level directive
SECTION .text
expands to the two lines
%define __SECT__ [SECTION .text] [SECTION .text]
Users may find it useful to make use of this in their own macros. For example, the
writefile
macro defined in the NASM Manual can be usefully
rewritten in the following more sophisticated form:
%macro writefile 2+ [section .data] %%str: db %2 %%endstr: __SECT__ mov dx,%%str mov cx,%%endstr-%%str mov bx,%1 mov ah,0x40 int 0x21 %endmacro
This form of the macro, once passed a string to output, first switches temporarily to
the data section of the file, using the primitive form of the SECTION
directive so as not to modify __SECT__
. It then declares its string in the data section, and then
invokes __SECT__
to switch back to whichever section the user was previously working in. It thus
avoids the need, in the previous version of the macro, to include a JMP
instruction to jump over the data, and also does not fail if, in a
complicated OBJ
format module, the user could potentially be
assembling the code in any of several separate code sections.