一直在自己学习89C52。终于使用ASM写出4K的程序了。虽然不是很顺利,断断续续写了很久,但毕竟写了。 由于程序较大,为了方便维护,因此使用SEGMENT指令把程序分割成小段。刚开始没有什么问题。 现在程序大了,问题就多了。本来好好的程序,加入某一行代码后出现了L121:IMPROPER FIXUP错误。 开始认为是定义的段太大,拆分段后OK。 随着程序的不断变大,频频出现这个错误,不堪其扰,决心找到一个彻底解决的方法。 打开KEIL UV2的A51.PDF,据说在使用ASM的ACALL等指令时超出2K范围就会出现这个错误,于是把这个段的ACALL全部改为LCALL,JMP改为LJMP,重新编译依然出现错误。 再看SEGMENT的使用说明,在后面加上INBLOCK参数,编译OK。但是实际运行到某一处,则89C52会当机。使用仿真器追踪也无法定位出问题的地方。看来只是KEIL UV2蒙蔽自己的手段而已。 上网搜索“IMPROPER FIXUP”,没有得到预期的结果,因此在这里向各位求助。希望有经验的可以帮一把。
下图是SEGMENT加入INBLOCK参数后编译不报错,实际运行错误。 |