Copyright (C) 2000-2012 |
GNU Info (nasm.info)Section 4.8.54.8.5. `STRUC' and `ENDSTRUC': Declaring Structure Data Types ------------------------------------------------------------- The core of NASM contains no intrinsic means of defining data structures; instead, the preprocessor is sufficiently powerful that data structures can be implemented as a set of macros. The macros `STRUC' and `ENDSTRUC' are used to define a structure data type. `STRUC' takes one parameter, which is the name of the data type. This name is defined as a symbol with the value zero, and also has the suffix `_size' appended to it and is then defined as an `EQU' giving the size of the structure. Once `STRUC' has been issued, you are defining the structure, and should define fields using the `RESB' family of pseudo-instructions, and then invoke `ENDSTRUC' to finish the definition. For example, to define a structure called `mytype' containing a longword, a word, a byte and a string of bytes, you might code struc mytype mt_long: resd 1 mt_word: resw 1 mt_byte: resb 1 mt_str: resb 32 endstruc The above code defines six symbols: `mt_long' as 0 (the offset from the beginning of a `mytype' structure to the longword field), `mt_word' as 4, `mt_byte' as 6, `mt_str' as 7, `mytype_size' as 39, and `mytype' itself as zero. The reason why the structure type name is defined at zero is a side effect of allowing structures to work with the local label mechanism: if your structure members tend to have the same names in more than one structure, you can define the above structure like this: struc mytype .long: resd 1 .word: resw 1 .byte: resb 1 .str: resb 32 endstruc This defines the offsets to the structure fields as `mytype.long', `mytype.word', `mytype.byte' and `mytype.str'. NASM, since it has no _intrinsic_ structure support, does not support any form of period notation to refer to the elements of a structure once you have one (except the above local-label notation), so code such as `mov ax,[mystruc.mt_word]' is not valid. `mt_word' is a constant just like any other constant, so the correct syntax is `mov ax,[mystruc+mt_word]' or `mov ax,[mystruc+mytype.word]'. automatically generated by info2www version 1.2.2.9 |