はじめに
タイトルの通りです。現在も解決していません。
解決しました..!
不思議だと思ったのでメモ。
コンパイラは記載しないでおきます。
手順
hexに変換する部分でおかしくなっていました。
アセンブラ→.outファイルに変換→outファイルをinputにhexに変換
.outファイルに変換した際、一緒に生成しているlstファイルは問題なかったため、hexに変換する処理でおかしくなっていると想像..
問題のアセンブラコード
以下のアセンブラをコンパイルします。
mov 0x200, r10
jr 0x245e
hexファイルを逆アセンブルすると以下の結果に...
jr 0x245eと変換されることを期待しましたが、jr 0x2462に...
movea 0x0200,r0,r10
jr 0x2462
hexファイルを見ると以下の結果。
6番地のデータがおかしいです。
jr 0x245eの0x245eが書かれています。
相対アドレスとして計算されていません。0x245aが正しいです。
0x00000000: .dhw 0x5620
0x00000002: .dhw 0x0200
0x00000004: .dhw 0x0780
0x00000006: .dhw 0x245e
以下の命令だけでは問題ありません。
なんで..
jr 0x245e
原因
jr 即値だと、命令コードに即値が埋め込まれる仕様になっていました。
jrにラベルを指定することで問題は解決しました。
.section ~ > 0x0
mov 0x200, r10
jr XXX
.section ~ > 0x245e
XXX:
nop
まとめ
確認できることは色々あると思うのですが、放置しております..
いつか解決...したい...
解決しました!よかった!
↓で問題ないのは、たまたまですね。解析力が足りず迷走しました。
jr 0x245e
いつもはラベルを指定していたため、気づきませんでした..
今後は気を付けます。