public language label... ; For TASM and MASM
public label language... ; for WASM
The label declared by the directive PUBLIC, becomes the program available to
another modules. So, it is possible to declare names of procedures, variables
and the constants determined by the directive EQU. The optional operand of
language (C, PASCAL, BASIC, FORTRAN, SYSCALL or STDCALL) specifies
that the label will be caused from the module written in the corresponding
language, and if necessary changes it (for example, adds _ before the first
symbol of a label).
commdist language label:type... ; for TASM
comm language distlabel:type... ; for TASM
commdistlabel:type language... ; for WASM
The directive COMM describes the general variable. Such variables are available
from all modules, and their placement in the program is defined at a configuration
Obligatory arguments of the directive COMM a label (actually a name of the
general variable) and type (BYTE, WORD, DWORD, FWORD, QWORD, TBYTE
or a structure name). The optional operand specifies "distance" (NEAR or FAR),
whether there is a variable in group of segments of DGROUP (the near variable,
for access is enough shift) or out of these segments (the distant variable, for
access is required the segment address). For models of memory of TINY,
SMALL and COMPACT by default value of this operand is accepted to NEAR.
And at last, the operand "language" works to similarly same operand for PUBLIC.
extrn language label:type... ; for MASM and TASM
extrnlabel:type language... ; for WASM
Describes label defined in other module (by means of PUBLIC). The type (BYTE,
WORD, DWORD, FWORD, QWORD, TBYTE, the name of structure, FAR,
NEAR, ABS) has to correspond to label type in that module where it was
established (the ABS type is used for constants from other modules determined
by the directive EQU). The optional operand of language works as well as for the
global language label:type... ; for MASM and TASM
globallabel:type language... ; for WASM
The directive GLOBAL works, as PUBLIC and EXTRN at the same time. When
the specified label is in the same module, it becomes available to other modules
as though the directive PUBLIC was executed. If the label isn't described it is
considered external and the action similar to action of the directive EXTRN is
33. Conditional assembling. Expressions
At the majority of programming languages there are the commands, allowing to
ignore this or that site of the program depending on performance of conditions,
for example: in language C it is carried out by preprocessor commands #if, #ifdef,
#ifndef, etc. The assembler too gives such opportunity.
If value of expression zero (lie), all site of the program between IF and ENDIF
is ignored. The directive IF can be combined with ELSE and ELSEIF also:
If value of expression zero, is assembled a program site from ELSE to ENDIF,
otherwise from IF to ELSE.
So, if, for example, expression 2 isn't equal to zero, the program site between the
first and second directive ELSEIF will be assembled. If all three expressions are
equal to zero, the fragment from ELSE to ENDIF is assembled. This structure of
directives can be used in that specific case similar to operators of switch/case of
languages of high level, if expressions checks of some constant on equality.
Except the general directives IF and ELSEIF assemblers support a set of special
commands, each of which checks a special condition:
IF1/ELSEIF1 if the assembler carries out the first pass of assembling;
IF2/ELSEIF2 if the assembler carries out the second pass of assembling (often doesn't
work at modern assemblers);
IFE expression/ELSEIFE expression if expression is equal to zero (in a false manner);
IFDEF label/ELSEIFDEF label if a label is defined;
IFNDEF label/ELSEIFNDEF label if a label isn't defined;
IFB <argument>/ELSEIFB <argument> if value of argument a gap (these and all
following directives are used in macrodefinitions for check of parameters);
IFNB <argument>/ELSEIFNB <argument> if value of argument not a gap (it is used in macrodefinitions for check of the given parameters);
IFDIF <arg1>, <arg2>/ELSEIFDIF <arg1>, <arg2> if arguments differ (with distinction of capital and small letters);
IFDIFI <arg1>, <arg2>/ELSEIFDIFI <arg1>, <arg2> if arguments differ (without distinction of capital and small letters);
IFIDN <arg1>, <arg2>/ELSEIFIDN <arg1>, <arg2> if arguments are identical (with distinction of capital and small letters);
IFIDNI <arg1>, <arg2>/ELSEIFIDNI <arg1>, <arg2> if arguments are identical (without distinction of capital and small letters).
Expression is a set of numbers, labels or the strings connected with each
other by operators.
Operator <> (angular brackets). The part of expression concluded in angular
brackets, isn't calculated, and applied as a string of symbols, for example:
message1 equ <foobar>
Operator () (parentheses). The part of expression concluded in parentheses, is
calculated first of all.
mov al, 2*(3+4); mov al, 14
Arithmetic operators: + (plus), (minus), * (multiplication), / (integer division),
MOD (remainder of division). They carry out the corresponding arithmetic
mov al, 90 mod 7; mov al, 6
Besides, the unary minus concerns to arithmetic operators - a minus which put
before a negative number.
Logical operators: AND, NOT, OR, XOR (excluding OR), SHL (shift to the left),
SHR (shift to the right). These operators carry out the corresponding logical
mov ax, 1234h AND 4321h; mov ax, 0220h
Operators of comparison: EQ (equally), GE (it is more or equally), is (more) than
GT, LE (it is less or equally), is (less) than LT, NE (not equally). The result of
action of each of these operators unit if the condition is satisfied, and zero if
isn't carried out.
.errnz $ gt 65535 ;If the address more than 64 KB a
Operators of addressing:
SEG expression the segment address;
OFFSET expression shift;
THIS type the current address (MASM and TASM);
The PTR type expression type redefinition;
LARGE expression 32-bit shift (TASM and WASM);
SMALL expression 16-bit shift (TASM and WASM);
SHORT expression 8-bit shift.
Date: 2015-01-29; view: 402