データ・コンテキスト内の実行シンボル(その1)
私の言う「データ・コンテキスト内の実行シンボル」とは
における「TEXT1」のこと。ちなみに上の記述はエラーになる。
.section .str_area, code
TEXT1: .string "Hello world!\n".text
.global _main
_main:
mov #TEXT1, w1
TBLRDL.b [w1], w0
PIC24はハーバード・アーキテクチャで命令バスとデータ・バスが分離されているため、ラベルが指している場所がプログラム空間なのかデータ空間なのか(はたまたそれ以外なのか)区別されている。
???.s: Assembler messages:
???.s:??: Error: Cannot reference executable symbol (TEXT1) in a data context
命令バスとデータ・バスが分離されていないフォンノイマン・アーキテクチャ(でいいのかな?)に慣れきった頭だとつい忘れがちとなる。
最初のコードでは、固定文字列をProgramROMに割り付けるため、セクションにcode属性を付けた。そうするとTEXT1はプログラム空間を指すことになり、これをW1レジスタに入れているのがいけないのだが、理由が分からない。
プログラム空間は24bitで、MOV命令は16bitリテラルなので受け付けられない、というようなエラー・メッセージじゃないよなあ。
まだまだ勉強が足りないようだ。