Memory 程序集中的地址错误(ColdFire MCF5307)

Memory 程序集中的地址错误(ColdFire MCF5307),memory,assembly,coldfire,Memory,Assembly,Coldfire,在我的第一门汇编语言课程中,我对调试过程中出现的神秘错误消息感到沮丧。。。我承认,以下信息不足以找到问题的原因(鉴于我对汇编语言ColdFire(MCF5307,M68K系列)的理解有限),但我愿意接受任何建议 jsr输出字符串 地址错误(格式0x04矢量0x03故障状态0x1状态寄存器0x2700) 我发现了一个类似的问题,关于地址错误 问题的答案指出,地址错误是因为代码“错误地”试图在非对齐边界上执行(或访问非对齐内存) 因此,我的问题是: “错误地”尝试执行未对齐的边界/内存意味着什么?

在我的第一门汇编语言课程中,我对调试过程中出现的神秘错误消息感到沮丧。。。我承认,以下信息不足以找到问题的原因(鉴于我对汇编语言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。