在我的第一门汇编语言课程中,我对调试过程中的隐秘错误信息感到沮丧。我承认以下信息不足以找出问题的原因(考虑到我对汇编语言ColdFire(MCF5307,M68K系列)的理解有限),但我很乐意听取任何建议。
..。 jsr out_string 地址错误(格式0x04向量0x03故障状态0x1状态reg 0x2700)
我在http://forums.freescale.com/freescale/board/message?board.id=CFCOMM&thread.id=271上发现了一个类似的问题,一般是关于地址错误的。
问题的答案是,地址错误是因为代码“不正确”地试图在不结盟边界上执行(或访问不结盟内存)。
所以我的问题是:
发布于 2009-11-20 22:52:01
首先,这可能不是导致错误的指令。请务必查看上一条或下一条指令是否会导致这种情况。但是,假设异常处理程序和调试器已经改进:
对齐异常是从地址检索32位(4字节)数据时发生的情况,地址不是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-20 22:48:47
我已经很久没有使用68K系列处理器了,但我可以给您一些提示。试图在非对齐边界上执行意味着在奇数地址上执行代码。例如,如果out_string位于设置了低位的地址。
对2或4字节数据的数据访问也是如此。我不确定Coldfire是否支持对奇数内存地址的字节访问,但其他68K家庭成员支持。
地址错误发生在在所有情况下导致错误的指令上。
找出那里有什么指示。如果pc匹配(或接近),那么它就是一个未对齐的执行。如果是内存访问(例如move.w d0,( a0 ) ),则检查正在读取/写入的地址,在本例中是a0指向的地址。
我只想补充一点,这是非常好的东西来弄清楚。在我的日常工作中,我设计了高端医疗成像设备,但偶尔我需要降到这个水平。我发现并解决了不止一个COTS操作系统的问题,因为我能够追踪这类问题。
https://stackoverflow.com/questions/1773646
复制相似问题