1

参加我的第一门汇编语言课程,我在调试过程中对神秘的错误消息感到沮丧......我承认以下信息不足以找到问题的原因(鉴于我对汇编语言的理解有限,ColdFire(MCF5307 ,M68K 系列)),但我很乐意接受任何建议。

...

jsr out_string

地址错误(格式 0x04 矢量 0x03 故障状态 0x1 状态寄存器 0x​​2700)

我在http://forums.freescale.com/freescale/board/message?board.id=CFCOMM&thread.id=271上发现了一个类似的问题,关于一般的地址错误。

问题的答案表明地址错误是因为代码“错误地”尝试在未对齐的边界上执行(或访问未对齐的内存)。

所以我的问题是:

  1. “错误地”尝试执行未对齐的边界/内存是什么意思?如果有例子,那将有很大帮助

  2. 什么是非对齐边界/内存?

  3. 假设您几乎没有调试技术(例如使用断点和跟踪),您将如何解决此问题

4

2 回答 2

1

很久没用68K家族处理器了,不过可以给大家一些提示。尝试在未对齐的边界上执行意味着在奇数地址执行代码。例如,如果 out_string 位于设置了低位的地址。

对 2 或 4 字节数据的存储器的数据访问也是如此。我不确定 Coldfire 是否支持对奇数内存地址的字节访问,但其他 68K 家族成员支持。

地址错误发生在所有情况下导致错误的指令上。

找出那里有什么指令。如果 pc 匹配(或接近),则它是未对齐的执行。如果是内存访问,例如 move.w d0,(a0),则检查正在读取/写入的地址,在本例中是 a0 指向的地址。

我只是想补充一点,这是非常好的东西。我在日常工作中对高端医学成像设备进行编程,但有时我需要达到这个水平。我发现并解决了不止一个 COTS OS 问题,因为我能够追踪这类问题。

于 2009-11-20T22:48:47.783 回答
1

首先,可能不是导致错误的指令。请务必查看上一条或下一条指令是否可能导致它。但是,假设异常处理程序和调试器已经改进:

当从一个不是 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:   ...
于 2009-11-20T22:52:01.413 回答