1. 结构体定义

在NASM内部,没有实际意义上的定义结构体类型的机制,NASM使用宏 STRUC 和 ENDSTRUC来定义一个结构体。STRUC有一个参数,它是结构体的名字。可以使用“RESB”类伪指令定义结构体的域,然后使用ENDSTRUC来结束定义。

如下,定义一个名为“mystruc"的结构体,包含一个long, 一个word, 一个byte和一个字符串。

struc mytype

mt_long:  resd  1

mt_word: resw 1

mt_byte:  resb  1

mt_str:     resb  32

endstruc

在上面的代码中定义了,mt_long 在偏移地址0处,mt_word在4,mt_byte 在6,mt_str在7。

如果想要在多个结构体中使用具有同样名字的成员,可以把结构体定义成这样:

struc mytype

.long:  resd    1

.word:  resw    1

.byte:  resb    1

.str:   resb    32

endstruc

2. 结构体声明

声明一个结构体使用”ISTRUC“、”AT“ 和 “IEND”宏。在程序中声明一个“mystruc"结构体,可以像如下代码一样:

使用定义一:

MYSTRUC:

istruc

at  mt_long,    dd      123456

at  mt_word,    dw      7890

at  mt_byte,        db      'a'

at  mt_str,     db      'abcdefg',0

iend

使用定义二:

MYSTRUC:

istruc mytype

at  mytype.long,    dd      123456

at  mytype.word,    dw      7890

at  mytype.byte,    db      'a'

at  mytype.str,     db      'abcdefg',0

iend

3.  示例一

jmp start

struc mytype

.num:       resd    1

.str:       resb    32

endstruc

MYDATA:

istruc mytype

at  mytype.num,     dd  32

at  mytype.str,     db   'hello, world', 0

iend

start:

mov ax, cs

mov ds, ax

mov ax, 0b800h

mov es, ax

xor edi,edi

xor esi,esi

mov ah, 0ch

mov esi, MYDATA + mytype.str

mov edi, (80 * 10 + 0)*2

cld

.1: lodsb

test al, al

jmp .2

mov [es:edi], ax

add di, 2

jmp .1

.2:

mov ax, 4c00h

int 21h