2009-11-20 39 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