NASM - The Netwide Assembler

version 2.16.03

Chapter 6: Standard Macro Packages

The %use directive (see section 4.8.4) includes one of the standard macro packages included with the NASM distribution and compiled into the NASM binary. It operates like the %include directive (see section 4.8.1), but the included contents is provided by NASM itself.

The names of standard macro packages are case insensitive and can be quoted or not.

As of version 2.15, NASM has %ifusable and %ifusing directives to help the user understand whether an individual package available in this version of NASM (%ifusable) or a particular package already loaded (%ifusing).

6.1 altreg: Alternate Register Names

The altreg standard macro package provides alternate register names. It provides numeric register names for all registers (not just R8R15), the Intel-defined aliases R8LR15L for the low bytes of register (as opposed to the NASM/AMD standard names R8BR15B), and the names R0HR3H (by analogy with R0LR3L) for AH, CH, DH, and BH.

Example use:

%use altreg 

proc: 
      mov r0l,r3h                    ; mov al,bh 
      ret

See also section 12.1.

6.2 smartalign: Smart ALIGN Macro

The smartalign standard macro package provides for an ALIGN macro which is more powerful than the default (and backwards-compatible) one (see section 5.10.1). When the smartalign package is enabled, when ALIGN is used without a second argument, NASM will generate a sequence of instructions more efficient than a series of NOP. Furthermore, if the padding exceeds a specific threshold, then NASM will generate a jump over the entire padding sequence.

The specific instructions generated can be controlled with the new ALIGNMODE macro. This macro takes two parameters: one mode, and an optional jump threshold override. If (for any reason) you need to turn off the jump completely just set jump threshold value to –1 (or set it to nojmp). The following modes are possible:

The macro __?ALIGNMODE?__ is defined to contain the current alignment mode. A number of other macros beginning with __?ALIGN_ are used internally by this macro package.

6.3 fp: Floating-point macros

This packages contains the following floating-point convenience macros:

%define Inf             __?Infinity?__ 
%define NaN             __?QNaN?__ 
%define QNaN            __?QNaN?__ 
%define SNaN            __?SNaN?__ 

%define float8(x)       __?float8?__(x) 
%define float16(x)      __?float16?__(x) 
%define bfloat16(x)     __?bfloat16?__(x) 
%define float32(x)      __?float32?__(x) 
%define float64(x)      __?float64?__(x) 
%define float80m(x)     __?float80m?__(x) 
%define float80e(x)     __?float80e?__(x) 
%define float128l(x)    __?float128l?__(x) 
%define float128h(x)    __?float128h?__(x)

It also defines the a multi-line macro bf16 that can be used in a similar way to the Dx directives for the other floating-point numbers:

     bf16 -3.1415, NaN, 2000.0, +Inf

6.4 ifunc: Integer functions

This package contains a set of macros which implement integer functions. These are actually implemented as special operators, but are most conveniently accessed via this macro package.

The macros provided are:

6.4.1 Integer logarithms

These functions calculate the integer logarithm base 2 of their argument, considered as an unsigned integer. The only differences between the functions is their respective behavior if the argument provided is not a power of two.

The function ilog2e() (alias ilog2()) generates an error if the argument is not a power of two.

The function ilog2f() rounds the argument down to the nearest power of two; if the argument is zero it returns zero.

The function ilog2c() rounds the argument up to the nearest power of two.

The functions ilog2fw() (alias ilog2w()) and ilog2cw() generate a warning if the argument is not a power of two, but otherwise behaves like ilog2f() and ilog2c(), respectively.

6.5 masm: MASM compatibility

Since version 2.15, NASM has a MASM compatibility package with minimal functionality, as intended to be used primarily with machine-generated code. It does not include any "programmer-friendly" shortcuts, nor does it in any way support ASSUME, symbol typing, or MASM-style structures.

To enable the package, use the directive:

%use masm

Currently, the MASM compatibility package emulates:

In addition, NASM now natively supports, regardless of whether this package is used or not: