アドレッシングって何

先週、啓二さんから自動販売機の中に入っているPLCの話
を聞いた哲さん。自動販売機関係の仕事もやろうかと思い、
いろいろ調べてみた。PLCプログラムは、簡単に作成可能
とわかり、仕事にならないと諦めました。でも、PLCの話
で出たラダー言語が気になり、インターネットで調べている
と、GUIの環境で線を引っ張り、ラダー図を作成し、マイ
コンの機械語に変換するソフトを作れば、商売になるとニヤ
けていると、妻の瑞希さんに、怒られてしまいました。
慌ててロボを連れ、啓二さんの仕事部屋にやって来ました。
哲  :押忍。来たちゃったぜ。
啓二:どうした、慌てて。
哲  :儲け話を考えていて、ニヤけたらしいんだ。それで、
      瑞希に怒られてしまった。いや、まいった。
啓二:何の儲け話を考えていたんだよ。
哲  :PLCのプログラム開発環境をGUIで作って売出せばってねえ。
啓二:お前、馬鹿か。そんなものPLC製造、販売企業でとっくの昔に
      作って売っているよ。Windowsマシンで動く立派なのが。
哲  :ありゃ、もう作られているってか。
啓二:Windowsマシンよりも、自動販売機の台数の方が遥かに多いんだ。
      それを放っておくわけないだろう。
哲  :それも、そうだな。で、今日は何の話だ。
啓二:アドレッシングの話だ。
哲  :ドレッシングだって。
啓二:違う、アドレッシング。
      アセンブリ言語で、命令を書くときに、オペコードとオペランドが
      必要だ。オペコードは、命令そのもの。そしてオペランドは、命令
      が対象とする情報だ。

        MOV A,#10

      と、書くと、オペコードがMOV、オペランドがA,#10になる。
哲  :オペコードって、何かの略かな。
啓二:その通り。Operational Codeの略さ。オペコードとする。
哲  :で、A,#10の中に、アドレッシングは、入っているのか。
啓二:入っているよ。A,#10の中で、#10がイミーディエイトアドレッシングと
      呼ぶ形態なんだ。
哲  :イミーディエイトって、immidiateか。直ちにとか、そんな意味だが。
啓二:その通り。10という値を、直ちに利用するから、イミーディエイト。
      レジスタAには、数値の10が入るんだ。
      アセンブラプログラムは、#があると、この後に続くアドレスを直ちに
      レジスタに複写する。
哲  :他に、どんなアドレッシング方法があるんだ。
啓二:相対、絶対、間接のアドレッシングがある。
      相対は、プログラムカウンタの値を基準にして、2つ先とか4つ前の
      ように、アドレスを指定する方式。
      絶対というのは、メモリにつけたアドレスをそのまま利用する方式。
      間接は、レジスタペアに入っている値をアドレスとして、そのアドレスに
      入っているデータを対象とする方式。
哲  :わかったような、わからないような。
啓二:用語は出したが、あまり気にしないで、実際に動くプログラムを作って
      みればよい。プログラムを作ってみると、違いなんて直ぐにわかる。
哲  :そうだと、いいんだが。
啓二:じゃあ、簡単な命令を書いて、図で説明してやるよ。
哲  :うん、頼むよ。
啓二:じゃあ、最もよく使うMOV命令で説明しよう。

            MOV A,#10
            MOV A,[HL]
            MOV A,B
            MOV B,A
            MOV A,!THR
            MOV HL,#THR

      この程度でいいかな。
哲  :まず、MOV A,#10は、レジスタAに10を入れることがわかった。
      次に、MOV A,[HL]は、レジスタAにどんな値が入るんだ。
啓二:レジスタペアHLが指しているアドレスは、H、Lのレジスタの内容を
      連結した1234hになる。だから、アドレス1234hの内容で56h
      がレジスタAに複写される。


哲  :hって、16進を意味するのか。
啓二:おっと、説明してなかったな。そうだ。他に2進のbがあるの
      アセンブラによっては、8進のqも許してくれることもある。
哲  :お次は、MOV A,Bだなあ。これは、レジスタアドレッシングとでも
      いうのかなあ。
啓二:そうだよ。
      これは、レジスタBの内容をレジスタAに複写してしまう。


哲  :あのさ、この場合、レジスタAは転送先、レジスタBは転送元に
      なるんだよなあ。
啓二:そう。転送先、転送元をレジスタ、メモリのアドレス、メモリのアドレス
      で指定するデータなどに、どう割り振るかを決めて使うのかがアドレッシング
      とも言えるかな。
哲  :あっと、その説明の方がわかりすい。
啓二:そうか。人によって、理解できる表現は違うんだな。ま、それが個性だし。
哲  :MOV A,BとMOV B,Aは、動作は、同じじゃないのか。
啓二:そうさ。でも、命令によっては、転送先としてレジスタAのみという
      こともあるんだ。PDF形式のマニュアルを入手して、一覧表を見て
      その都度調べればいいだけだし、あまり深く考えないでいいよ。
      アセンブラ動かせば、できるできないは教えてくれるし。
哲  :そうだよな。あまり、深く考えても、大事なことが見えないのでは
      本末転倒だし。
啓二:そういうこと。残りを片づけてしまうか。
          MOV A,!THR
      は、絶対アドレス指定だから、ラベルで指定したアドレスを利用して
      (この場合なら、100h番地)その内容をレジスタAに複写する。
          MOVW HL,#THR
      は、イミディエイト指定だから、HLレジスタペアに、ラベルで指定
      した値がそのまま入る。

哲  :アセンブリ言語に関連するアドレッシングも、図を描いて考えると
      よくわかるな。こんな図は、C言語のプログラムでも有用だな。
啓二:そういうこと。じゃあ、ここまでにしておくか。

戻る