前回は,PHP版のPICアセンブラを紹介しました。物足りないところもあったと思います。今回はアセンブラの仕組みを解説しますので,ぜひほしい機能を追加してみてください(筆者は,昔のParallaxのアセンブラのローカルラベルやビットレベルのequが好きだったので,いつかやろうと思っています⁠)⁠。言語を実装するときに毎回出てくるような課題も扱っています。アセンブラ以外の言語の実装に興味のある方も,ご一読いただければ幸いです。基本的な処理アセンブリ言語は,とてもシンプルです。左端にラベル,タブのあとに,命令と,あれば引数か並びます。セミコロンからあとはコメントになります。命令は,CPUの命令以外に,アセンブラに指示を出す擬似命令があります。処理としては,まずコメントを取り除きます。スペースかタブの並びで,行を3つに分割します。すると,先頭がラベル,2番目が命令,3番目が引数になります。命令によって,引数がないもの,1つのもの,2つのものがあるので,命令の種類ごとに分けて処理します。アセンブラにはプログラムカウンタがあり,ここでは$orgを使用しています。CPU命令は,プログラムカウンタのアドレスに書き込まれます。以下の例を見てください。0x100」は擬似命令です。これは,プログラムカウンタを指定した値にします。次のnopはCPU命令なので,プログラムカウンタの0x100に割り当てられます。その次のsleepもCPU命令なので,0x101に割り当てられます。ところが,ラベルが出てくると,ちょっと面倒になります。これも具体例を見てみましょう。loop最初にequという擬似命令があります。これは,countというラベルに0x20という値を擦り当てます。C言語でいう#defineのようなものだと思ってください。これがラベルの1つめの使い方です。nop」という行があります。これは,この行のプログラムカウンタをラベルに割り当てるというものです。movlwの命令は0x100に,movwfの命令は0x101に格納されています。したがって,nopは0x102に格納されるので,loopは0x102になります。0x102」と書くのと同じことになります。0x100」と書いたらどうなるでしょう。厳密な仕様は調べられませんでしたが,mainは0x100になってほしいところです。このケースに対応するため,org擬似命令のみ,ラベルの処理の前に解釈するようにしています。他の命令の場合は,現在の(命令解釈前の)プログラムカウンタがラベルで使用されます。ループの場合,まず戻ってきたいところにラベルを定義して,そのあとにgoto文でラベルを指定します。goto文の時点では,すでにラベルが宣言されているところ注意してください。あるブロックをスキップする場合はどうなるでしょう。前方参照この例を見てください。nopgotoの行を評価した時点では,main2のラベルはまだ読み込まれていません。このため,先頭から1行ずつ解釈していった場合は,引数か確定しません。これを前方参照とか,後方参照と呼びます(※⁠)⁠。この場合でも,引数を未確定のままにして進めていくと,main2のラベルは0x104とわかります。そこで,まず第1段階でラベルをすべて読み込み,第2段階でラベルの値を使うという処理を行います。これを2パス方式といい,第1段階(パス1)ではラベルを読み込み,命令をチェックします。命令をチェックすることで,命令が格納されるアドレスがわかり,ラベルの値が確定します。PICの場合,命令は固定長なので,擬似命令のみを処理するような形になります。第2段階(パス2)では,命令の引数を評価します。ラベルが使用されているところも,この段階で確定します。して,アセンブルをおこなうことかできます。1つ悩んだのが,org擬似命令やequ擬似命令の引数に,ラベルを使用できるかどうかです。1」のような記述をしたいことがありますが,循環参照など,対応が面倒な面もあります。そこで,その時点で定義されているラベルだけを使用できることにしました。次回は,このアセンブラで出力したバイナリを,PICを書き込む方法を考えてみます。※)前方から,後方を参照するという意味なのですが,どちらの用法も見ます。普通は,問題になるケースでしかこの言葉は使わないので,困ることはありません。PIC著者プロフィール木元峰之(きもとみねゆき)独立系ソフトハウスに8年間勤務,パッケージソフトの開発や記事執筆などを行う。現在はフリーのコンサルタント。SWESTなどのワークショップで分科会のコーディネータを務める。デジタル回路設計歴30年,プログラミング歴27年。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。