为何使用EXTERNDEF时MASM的SIZEOF MyByteArray始终返回1?
问题解答
是的,你的判断完全正确——问题就出在MASM汇编器的编译期行为上。
核心原因
SIZEOF是编译期计算的伪指令,并非链接期解析的符号。当你在abs.asm中通过EXTERNDEF MyByteArray:BYTE声明符号时,汇编器编译该文件的阶段,只能识别到MyByteArray是单个BYTE类型的符号,完全无法知晓它在num.asm中实际是一个10字节的数组。因此汇编器会直接返回单个BYTE的大小(即1),这个值会被硬编码到目标文件中,后续链接阶段仅负责绑定符号地址,不会修改已经计算好的SIZEOF结果。
而本地定义数组时,汇编器能直接读取到数组的完整定义(比如BYTE 10 DUP(?)),所以编译期就能正确计算出SIZEOF为10。
更优解决方案
放弃跨文件用SIZEOF获取数组大小的思路,改用常量统一管理的方式:
- 在
num.inc头文件中添加数组大小的常量定义:MyByteArraySize EQU 10 EXTERNDEF MyByteArray:BYTE - 在
num.asm中用常量定义数组:include num.inc .data MyByteArray BYTE MyByteArraySize DUP(?) - 在
abs.asm中直接使用常量MyByteArraySize代替SIZEOF MyByteArray:include num.inc ; 调用printf时直接传入MyByteArraySize作为数组大小参数
这样后续修改数组大小,只需调整头文件里的MyByteArraySize常量,所有引用的地方会自动同步,无需手动逐个修改。
内容的提问来源于stack exchange,提问作者vengy
相关产品推荐
相关产品推荐

