You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:45:55