Memory 程序集中的地址错误(ColdFire MCF5307)
在我的第一门汇编语言课程中,我对调试过程中出现的神秘错误消息感到沮丧。。。我承认,以下信息不足以找到问题的原因(鉴于我对汇编语言ColdFire(MCF5307,M68K系列)的理解有限),但我愿意接受任何建议 jsr输出字符串 地址错误(格式0x04矢量0x03故障状态0x1状态寄存器0x2700) 我发现了一个类似的问题,关于地址错误 问题的答案指出,地址错误是因为代码“错误地”试图在非对齐边界上执行(或访问非对齐内存) 因此,我的问题是:Memory 程序集中的地址错误(ColdFire MCF5307),memory,assembly,coldfire,Memory,Assembly,Coldfire,在我的第一门汇编语言课程中,我对调试过程中出现的神秘错误消息感到沮丧。。。我承认,以下信息不足以找到问题的原因(鉴于我对汇编语言ColdFire(MCF5307,M68K系列)的理解有限),但我愿意接受任何建议 jsr输出字符串 地址错误(格式0x04矢量0x03故障状态0x1状态寄存器0x2700) 我发现了一个类似的问题,关于地址错误 问题的答案指出,地址错误是因为代码“错误地”试图在非对齐边界上执行(或访问非对齐内存) 因此,我的问题是: “错误地”尝试执行未对齐的边界/内存意味着什么?
我已经很久没有使用68K系列处理器了,但我可以给你一些提示。 试图在未对齐的边界上执行意味着在奇数地址执行代码。例如,如果out_字符串位于设置了低位的地址 对于2或4字节数据的存储器的数据访问也是如此。我不确定Coldfire是否支持对奇数内存地址的字节访问,但其他68K家族成员支持 在所有情况下都会在导致错误的指令上发生地址错误 找出有什么指示。如果pc匹配(或关闭),则它是未对齐的执行。如果是内存访问,例如move.w d0,(a0),则检查读取/写入的地址,在本例中是a0指向的地址
我只是想补充一点,这是很好的解决方法。我在日常工作中为高端医疗成像设备编程,但有时我需要降低到这个水平。我发现并修复了不止一个COTS操作系统问题,因为我能够追踪到这类问题。首先,可能不是指令导致了错误。一定要确定是上一条指令还是下一条指令导致了它。但是,假设异常处理程序和调试器有所改进: 是从不是4字节倍数的地址检索32位(4字节)数据时发生的情况。例如,变量x在地址2是32位,然后
const1: dc.w someconstant
x: dc.l someotherconstant
然后是指令
mov.l x, %r0
将导致68000(和68010,IIRC)上的数据对齐故障。68020消除了此限制并执行未对齐的访问,但以性能降低为代价。我不知道jsr
(跳转到子例程)指令需要对齐,但这并不是不合理的,而且很容易安排在每个函数之前,插入汇编语言的宏进行对齐:
.align long
func: ...
如果这是out_字符串的十六进制地址,那么这是一个奇数地址,末尾的1肯定是奇数。正如另一个人提到的,你需要在out_string符号前面对齐.align。