データ・コンテキスト内の実行シンボル(その1)

私の言う「データ・コンテキスト内の実行シンボル」とは


.section .str_area, code
TEXT1: .string "Hello world!\n"

.text
.global _main
_main:
mov #TEXT1, w1
TBLRDL.b [w1], w0

における「TEXT1」のこと。ちなみに上の記述はエラーになる。

???.s: Assembler messages:
???.s:??: Error: Cannot reference executable symbol (TEXT1) in a data context
PIC24はハーバード・アーキテクチャで命令バスとデータ・バスが分離されているため、ラベルが指している場所がプログラム空間なのかデータ空間なのか(はたまたそれ以外なのか)区別されている。
命令バスとデータ・バスが分離されていないフォンノイマンアーキテクチャ(でいいのかな?)に慣れきった頭だとつい忘れがちとなる。
最初のコードでは、固定文字列をProgramROMに割り付けるため、セクションにcode属性を付けた。そうするとTEXT1はプログラム空間を指すことになり、これをW1レジスタに入れているのがいけないのだが、理由が分からない。


プログラム空間は24bitで、MOV命令は16bitリテラルなので受け付けられない、というようなエラー・メッセージじゃないよなあ。
まだまだ勉強が足りないようだ。