アセンブリプログラムローダー
概要
- 目的: アセンブリプログラムローダーは、アセンブリ言語プログラムを2進数マシンコードに変換し、メモリコンポーネントに読み込む特殊コンポーネントです。人間が読めるアセンブリコードとデジタル回路が処理できる2進数命令の間のギャップを埋めます。
- シンボル: アセンブリプログラムローダーは、クロック、イネーブル、アドレス出力イネーブル、データ出力イネーブルの入力と、アドレスバス、データバス、書き込みイネーブル、チップセレクト、ロード完了の出力を持つ矩形ブロックで表されます。
- DigiSim.io での役割: コードを手動で2進数に変換することなく、CPU設計でアセンブリプログラムのテストと実行を可能にし、コンピュータアーキテクチャの概念を探求するための不可欠な教育ツールとなっています。

機能説明
論理動作
アセンブリプログラムローダーは、ユーザーが入力したアセンブリコードを読み取り、マシンコードに変換し、メモリアドレスに順次書き込みます。アイドル、ロード中、完了の明確なフェーズを持つステートマシンとして動作します。
動作フロー:
- ローダーがトリガーされると(プロパティダイアログから)、変換プロセスを開始します
- ENがHIGHの間、CLKの各立ち上がりエッジで、ローダーは次の命令に進みます
- ロード中、WEとCS出力はHIGHになります
- ロードが完了すると、LC(ロード完了)出力がHIGHになります
- A_OEがHIGHの場合はアドレス出力が駆動され、D_OEがHIGHの場合はデータ出力が駆動されます
入力と出力
入力(合計4つ):
- CLK: ピン0。クロック入力 — ローダーは各立ち上がりエッジで進みます。
- EN(イネーブル): ピン1。ローダーの全体的なイネーブル。HIGHの場合のみロードが進みます。
- A_OE(アドレス出力イネーブル): ピン2。HIGHの場合、アドレス出力(A0〜A7)が駆動されます。それ以外はハイインピーダンス。
- D_OE(データ出力イネーブル): ピン3。HIGHの場合、データ出力(D0〜D7)が駆動されます。それ以外はハイインピーダンス。
出力(合計19個):
- A0〜A7: ピン0〜7。書き込むメモリロケーションを指定する8ビットアドレスバス。
- D0〜D7: ピン8〜15。メモリに書き込まれるマシンコード命令を含む8ビットデータバス。
- WE: ピン16。書き込みイネーブル信号 — アクティブロード中はHIGH。
- CS: ピン17。チップセレクト信号 — アクティブロード中はHIGH。
- LC(ロード完了): ピン18。ロードが完了するとHIGHになります。
設定可能なパラメータ
- アセンブリプログラム: ユーザーはコンポーネントのプロパティダイアログからアセンブリコードを入力・編集できます。
- メモリサイズ: 読み込める命令の最大数(通常、接続されたメモリコンポーネントによって制限されます)。
DigiSim.io でのビジュアル表現
アセンブリプログラムローダーは、左側にラベル付けされた入力(CLK、EN、A_OE、D_OE)と右側に出力(A0〜A7、D0〜D7、WE、CS、LC)を持つ矩形ブロックとして表示されます。回路に接続すると、コンポーネントは出力に表示される値を通じて現在の状態を視覚的に示します。ユーザーはコンポーネントのプロパティダイアログを通じてアセンブリコードを入力・編集できます。
教育的価値
主要概念
- アセンブリプログラミング: アセンブリ言語プログラミングの基本概念を紹介します。
- マシンコード生成: 人間が読めるアセンブリ命令が2進数にどのように変換されるかを実証します。
- メモリ管理: プログラムがメモリに順次どのように読み込まれるかを示します。
- コンピュータアーキテクチャ: ソフトウェアの概念とハードウェア実装を結びつけます。
- 命令セットアーキテクチャ: 命令フォーマットとエンコーディングの概念を紹介します。
学習目標
- アセンブリ言語とマシンコードの関係を理解する。
- プログラムが実行のためにメモリにどのように読み込まれるかを学ぶ。
- シンボリック命令を2進数に変換するプロセスを認識する。
- アセンブリプログラミングの概念をCPU設計の単純なプログラム作成に応用する。
- コンピュータシステムにおけるソフトウェアとハードウェアのインターフェースを理解する。
使用例
- CPUテスト: CPU機能を検証するためのテストプログラムの読み込み。
- デモ回路: コンピュータアーキテクチャの教育的な例の作成。
- アルゴリズム実装: カウント、加算、単純なループなどの基本アルゴリズムを実装するアセンブリプログラムの記述。
- メモリシステムテスト: 制御された方法でのメモリ読み書き操作の検証。
- 命令セット探索: 異なる命令タイプとその効果の実験。
技術ノート
- アセンブリプログラムローダーは、一般的な命令(LDA、STA、ADD、SUB、JMP、JZ、JNZ、HLT)を持つ単純化されたアセンブリ言語をサポートします。
- アセンブリコード内のラベルは、ロードプロセス中にメモリアドレスに自動的に解決されます。
- @addr: value 構文を使用して特定のメモリロケーションをデータ値で初期化できます。
- ローダーは命令を順次処理するため、大きなプログラムには大きなメモリコンポーネントが必要になる場合があります。
- DigiSim.io において、ローダーの動作は実際のコンピュータシステムのプログラム読み込みフェーズをシミュレートし、アセンブラとリンカの複雑さを抽象化します。
- WE、CS、LCシグナルを使用した適切な同期は、ローダーを他のコンポーネントと統合する際に重要です。
ピン
| ピン名 | タイプ | ピンインデックス | 説明 |
|---|---|---|---|
| CLK | 入力 | 0 | クロック信号 — 立ち上がりエッジでローダーが進む |
| EN | 入力 | 1 | イネーブル — HIGHの場合のみロードが進む |
| A_OE | 入力 | 2 | アドレス出力イネーブル — HIGHの場合アドレスバスを駆動 |
| D_OE | 入力 | 3 | データ出力イネーブル — HIGHの場合データバスを駆動 |
| A0〜A7 | 出力 | 0〜7 | メモリアドレス入力に接続する8ビットアドレスバス |
| D0〜D7 | 出力 | 8〜15 | メモリデータ入力に接続する8ビットデータバス |
| WE | 出力 | 16 | 書き込みイネーブル — アクティブロード中はHIGH |
| CS | 出力 | 17 | チップセレクト — アクティブロード中はHIGH |
| LC | 出力 | 18 | ロード完了 — ロードが完了するとHIGH |
使用方法
コンポーネントをROMまたはRAMコンポーネントに接続します:
- A0〜A7出力をメモリコンポーネントのアドレス入力ピンに接続
- D0〜D7出力をメモリコンポーネントのデータ入力ピンに接続
- WEをメモリコンポーネントの書き込みイネーブル入力に接続
- CSをメモリコンポーネントのチップセレクト入力に接続
コンポーネントのプロパティダイアログにアセンブリプログラムを入力します。
CLKをクロックソースに接続し、EN、A_OE、D_OEをHIGHに設定してロードを開始します。
コンポーネントは自動的に以下を実行します:
- アセンブリコードをマシンコードに変換
- マシンコードをアドレス0から始まる連続したメモリアドレスに書き込む
- ロードプロセス中はWEとCSをHIGHに保つ
- 完了するとLC(ロード完了)をHIGHに設定
CPUでプログラムを実行する前にLCシグナルを待ちます。
サポートされるアセンブリ言語
アセンブリプログラムローダーは、以下の命令を持つ単純なアセンブリ言語をサポートします:
LDA addr ; メモリアドレスからアキュムレータに読み込む
STA addr ; アキュムレータをメモリアドレスに格納する
ADD addr ; メモリアドレスの値をアキュムレータに加算する
SUB addr ; メモリアドレスの値をアキュムレータから減算する
JMP addr ; アドレスにジャンプする
JZ addr ; アキュムレータがゼロの場合アドレスにジャンプする
JNZ addr ; アキュムレータがゼロでない場合アドレスにジャンプする
HLT ; 実行を停止する
プログラム例
以下は1から10までカウントしてメモリアドレス15に結果を格納するプログラムの例です:
LDA 14 ; アキュムレータに0を読み込む(アドレス14から)
LOOP: ADD 13 ; 1を加算する(アドレス13から)
STA 15 ; 結果をアドレス15に格納する
SUB 12 ; 10を減算する(アドレス12から)
JZ END ; 結果がゼロ(10に達した)の場合ENDにジャンプ
LDA 15 ; 現在のカウントをアキュムレータに戻す
JMP LOOP ; LOOPに戻る
END: HLT ; 停止
; データセクション(プログラムのどこかに含める必要あり)
@12: 10 ; アドレス12の値10
@13: 1 ; アドレス13の値1
@14: 0 ; アドレス14の値0
ヒント
- ローダーはプログラムを順次処理し、各命令をメモリに書き込みます
- ラベル(LOOPやENDなど)は自動的にアドレスに解決されます
- @addr: value 構文を使用して特定の値を特定のアドレスに配置します
- 大きなプログラムには、メモリコンポーネントのサイズを増やす必要がある場合があります
- CPUとの適切な同期を確保するためにLCシグナルを確認します
- コンポーネントはセミコロン(;)文字を使用したコメントをサポートします