NASM手册阅读笔记(6) - 预处理器之结构定义
结构定义
格式
struc xxx
.aaa resw 1
.bbb resw 1
endstruc
说明
他并非真正的结构体支持,而是相当于定义了一系列的LABEL,并且这些LABEL的地址都是相对于结构体开始处的偏移地址
所以 .aaa = 0; .bbb = 2;因为.aaa 占用了2个字节
定义实体数据
istruc xxx
at .aaa, dw 123
at .bbb, dw 321
iend
at 符号是定位使用的
at .aaa, dw 123 ; 将地址移动到 .aaa 也就是相对偏移 0x0处然后赋值一个DWORD = 123
at .bbb, dw 321 ; 将地址移动到 .bbb 也就是相对偏移 0x2处然后赋值一个DWORD = 321
所以如果我们定义的数据是紧凑的话完全是可以这样的
at .aaa
dw 123 ; 实际赋值 .aaa
dw 321; 实际赋值 .bbb
实际使用
因为子标签实际上只是一个偏移地址,所以访问数据需要这样
mov ax, [var + xxx.aaa]
ALGIN
格式
ALIGN 参数1 [, db 0]
ALIGN 参数1 [, resb 1]
ALIGNB 参数1 ;相当于 ALIGN 参数1 , resb 1
说明
作用就是通过使用 times XXX db 0 或者 times XXX resb 1 来使得,当ALGIN这条指令结束的时候相对于段开始的时候的偏移地址是按照参数1的要求边界对齐的
var db 1,2,3
align 4
假设var 开始地址0,定义三个DB之后 algin的开始位置就是3,然后我们要求4字节对齐,所以algin指令就会补一个db出来使得4字节对齐,
展开后等效于
var db 1,2,3
db 0 ; algin 4 指令生成的内容
这个指令会使得我们在结构体也好,其他地方也好定义出来的数据不紧凑,但是字节对齐有助于提高数据的存储速度。