NASM中是否有MASM的TYPE替代方案?如何自动获取数组元素大小?
NASM中替代MASM TYPE操作符的方案
NASM没有提供和MASM的TYPE操作符完全等价的内置功能,但可以通过以下几种方式自动确定数组元素的大小:
1. 用宏模拟TYPE功能
定义一个宏来匹配不同的数据类型,返回对应的字节大小:
%macro TYPE 1 %ifidn %1, db 1 %elifidn %1, dw 2 %elifidn %1, dd 4 %elifidn %1, dq 8 %else %error "不支持的数据类型" %endif %endmacro
使用示例:
array dw 1, 2, 3, 4 arrSize equ $-array ; 数组总大小,8字节 elemSize equ TYPE dw ; 获取字类型的大小,2字节 elemCount equ arrSize / elemSize ; 元素个数,4
2. 关联类型符号自动计算
通过定义一个和数组元素同类型的符号,利用地址差获取元素大小:
elemType dw 0 ; 该符号的类型与数组元素一致 array dw 1, 2, 3, 4 elemSize equ $ - elemType ; 自动得到元素大小2字节 elemCount equ ($ - array) / elemSize
后续如果修改数组类型(比如改成dd),只需同步修改elemType的类型,elemSize会自动更新,无需手动调整数值。
3. 使用NASM的%size伪指令
%size伪指令可以返回指定符号的字节大小,通过定义单个元素的符号来获取:
elem dw 0 elemSize equ %size(elem) ; 返回elem的字节大小2 array dw 1,2,3,4 elemCount equ ($-array)/elemSize
内容的提问来源于stack exchange,提问作者Powarito
相关产品推荐
相关产品推荐

