NASM provides various define directives for reserving storage space for variables. The define assembler directive is used for allocation of storage space. It can be used to reserve as well as initialize one or more bytes.
Aug 29, 2018 - The LENGTH, SIZE, and TYPE operators have a limited meaning in inline assembly. They cannot be used at all with the DUP operator.
Allocating Storage Space for Initialized Data
The syntax for storage allocation statement for initialized data is −
Where, variable-name is the identifier for each storage space. The assembler associates an offset value for each variable name defined in the data segment.
There are five basic forms of the define directive −
Directive | Purpose | Storage Space |
---|---|---|
DB | Define Byte | allocates 1 byte |
DW | Define Word | allocates 2 bytes |
DD | Define Doubleword | allocates 4 bytes |
DQ | Define Quadword | allocates 8 bytes |
DT | Define Ten Bytes | allocates 10 bytes |
Following are some examples of using define directives −
Please note that −
Each byte of character is stored as its ASCII value in hexadecimal.
Each decimal value is automatically converted to its 16-bit binary equivalent and stored as a hexadecimal number.
Processor uses the little-endian byte ordering.
Negative numbers are converted to its 2's complement representation.
Short and long floating-point numbers are represented using 32 or 64 bits, respectively.
The following program shows the use of define directive −
Live DemoWhen the above code is compiled and executed, it produces the following result −
Allocating Storage Space for Uninitialized Data
The reserve directives are used for reserving space for uninitialized data. The reserve directives take a single operand that specifies the number of units of space to be reserved. Each define directive has a related reserve directive.
There are five basic forms of the reserve directive −
Directive | Purpose |
---|---|
RESB | Reserve a Byte |
RESW | Reserve a Word |
RESD | Reserve a Doubleword |
RESQ | Reserve a Quadword |
REST | Reserve a Ten Bytes |
Multiple Definitions
You can have multiple data definition statements in a program. For example −
The assembler allocates contiguous memory for multiple variable definitions.
Multiple Initializations
The TIMES directive allows multiple initializations to the same value. For example, an array named marks of size 9 can be defined and initialized to zero using the following statement −
The TIMES directive is useful in defining arrays and tables. The following program displays 9 asterisks on the screen −
Live DemoWhen the above code is compiled and executed, it produces the following result −
-->Microsoft Specific
The LENGTH, SIZE, and TYPE operators have a limited meaning in inline assembly. They cannot be used at all with the DUP
operator (because you cannot define data with MASM directives or operators). But you can use them to find the size of C or C++ variables or types:
The LENGTH operator can return the number of elements in an array. It returns the value 1 for non-array variables.
The SIZE operator can return the size of a C or C++ variable. A variable's size is the product of its LENGTH and TYPE.
The TYPE operator can return the size of a C or C++ type or variable. If the variable is an array, TYPE returns the size of a single element of the array.
For example, if your program has an 8-element int array,
the following C and assembly expressions yield the size of arr
and its elements.
__asm | C | Size |
---|---|---|
LENGTH arr | sizeof (arr)/sizeof (arr[0]) | 8 |
SIZE arr | sizeof (arr) | 32 |
TYPE arr | sizeof (arr[0]) | 4 |
END Microsoft Specific
See also
Using Assembly Language in __asm Blocks