为何vasm6502的.org $fffc未将$8000置于0xfffc地址?
问题原因与解释
你碰到的问题要么是混淆了ROM文件偏移地址和内存绝对地址,要么是对vasm oldstyle模式下.org的行为没摸透:
1. 内存地址和文件偏移的对应关系
你代码开头用.org $8000指定了程序在内存里的起始地址是$8000,这意味着生成的ROM文件会被加载到内存的$8000-$ffff区间(刚好32KB)。这时候文件偏移和内存地址的换算很直接:内存绝对地址 = 文件偏移 + $8000
当你用.org $fffc指定要写到内存的$fffc地址时,对应的文件偏移就是$fffc - $8000 = $7ffc——所以你看到.word $8000被写到了文件的0x7ffc位置,但这个位置在内存里就是你想要的$fffc,完全没问题,只是你看的是文件偏移而非实际内存地址。
2. vasm oldstyle下.org的行为
在vasm的6502 oldstyle语法里,.org默认是设置内存绝对地址,不是段内偏移。但如果你生成的是固定大小的ROM(比如32KB),汇编器会自动把绝对地址映射到文件的对应偏移位,这就导致了你看到的0x7ffc结果。
验证方法
要确认内容确实在内存的$fffc位置,你可以:
- 用反汇编工具加载ROM文件,指定加载基地址为$8000,查看$fffc地址的内容,会发现正好是$8000。
- 如果非要让内容写到文件的0xfffc偏移处(一般没必要,因为32KB文件的最大偏移是0x7fff),可以把输出文件大小改成64KB,此时
.org $fffc对应的文件偏移就是0xfffc。
替代写法
如果需要强制指定绝对地址,不受输出文件大小限制,可以用vasm的absorg指令代替.org:
absorg $fffc .word $8000 .word $0000
内容的提问来源于stack exchange,提问作者Georgi Peev
相关产品推荐
相关产品推荐

