NASM手册阅读笔记 - 预处理器之结构定义

结构定义

格式

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 指令生成的内容

这个指令会使得我们在结构体也好,其他地方也好定义出来的数据不紧凑,但是字节对齐有助于提高数据的存储速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值