2009-11-20 34 views
1

考虑到我在汇编语言方面的第一门课程,我在调试过程中遇到了隐晦的错误消息......我承认以下信息不足以找出问题的原因(给定我对汇编语言ColdFire(MCF5307,M68K系列)的理解有限,但我很乐意接受任何建议。装配中的地址错误(ColdFire MCF5307)

...

JSR out_string

地址错误(格式0×04矢量×03故障状态为0x1状态REG 0x2700)

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

该问题的答案指出,地址错误是因为代码“不正确”尝试在非对齐的边界上执行(或访问非对齐的内存)。

所以我的问题是:

  1. 是什么意思为“不正确”试图执行一个非对齐边界/内存?如果有例子,这将有很大帮助

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

  3. 你如何接近你有一点的调试技术解决这个问题,假设(例如使用断点和跟踪)

回答

2

首先,它可能不是导致错误的指令。一定要看看上一条指令或下一条指令是否可能导致它。但是,假设异常处理程序和调试程序已得到改进:如果从不是4字节倍数的地址中检索到32位(4字节)数据,就会发生这种情况:

An alignment exception。例如,变量x是在地址2 32位,然后

const1: dc.w someconstant 
x:  dc.l someotherconstant 

则指令

  mov.l x, %r0 

会导致在68000(和68010,这个)数据对齐错误。 68020取消了这一限制并执行了未对齐的访问,但代价是性能下降。我不知道该jsr(跳转至子程序)指令要求对齐的,但它不是不合理,很容易安排,之前的各项功能,插入汇编语言的宏对齐:

 .align long 
func: ... 
2

它已经很长一段时间,因为我已经使用了68K系列处理器,但我可以给你一些提示。 尝试在未对齐的边界上执行意味着在奇数地址执行代码。例如,如果out_string位于低位设置的地址处。

同样适用于访问2或4字节数据的存储器的数据。我不确定Coldfire是否支持奇数内存地址的字节访问,但是其他68K家族成员却支持。

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

找出有什么指令。如果pc匹配(或接近),那么它是未对齐的执行。如果它是内存访问,例如move.w d0,(a0),然后检查看哪个地址正在读/写,在这种情况下是由a0指向的地址。

我只是想补充说,这是非常好的东西,搞清楚。我在日常工作中对高端医疗成像设备进行编程,但偶尔我需要降低到这个水平。我找到并解决了一个以上的COTS操作系统问题,因为能够追踪这类问题。

+0

如果是十六进制out_string的地址,那么这是一个奇怪的地址,最后1是绝对奇怪的。与其他人提到的一样,您需要在out_string符号前面的.align。 – 2009-11-20 23:53:23

+0

非常感谢您的留言;我解决了这个问题 – 2009-11-21 00:22:00