| English | 意味 |
|---|---|
| assembler/əˈsemblə/ | アセンブラ |
| mnemonic/nɪˈmɒnɪk/ | メンモニック |
| instruction set/ɪnˈstrʌkʃn set/ | 命令セット |
| machine code/məˈʃiːn kəʊd/ | 機械語 |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | アセンブリ言語 |
| operand/ˈɒpərænd/ | オペランド |
| opcode/ˈɒpkəʊd/ | オペコード |
| symbol table/ˈsɪmbl ˈteɪbl/ | シンボルテーブル |
| label/ˈleɪbl/ | ラベル |
| forward references/ˈfɔːwəd ˈrefrənsɪz/ | 前方参照 |
| addressing mode/əˈdresɪŋ məʊd/ | アドレス指定モード |
| immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ | 即値指定 |
| direct addressing/daɪˈrekt əˈdresɪŋ/ | 直接アドレス指定 |
| indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ | 間接アドレス指定 |
| indexed addressing/ˈɪndekst əˈdresɪŋ/ | インデックスアドレス指定 |
| relative addressing/ˈrelətɪv əˈdresɪŋ/ | 相対アドレス指定 |
スイッチの列における31個の命令
- 1949年、ケンブリッジのEDSACコンピュータは、David Wheelerによって書かれた「初期指令」と呼ばれる31の命令をスイッチで設定して起動しました。
- これらの命令の全仕事は、AやSのような文字を紙テープから読み取り、機械が実際に理解できる数字に変換することでした:これが最初のアセンブラです。
- 以来、プログラマはビットパターンに代えて記憶しやすい略称(mnemonics)を使用しており、試験で使用される命令セットもその直系の派生です。
- このレッスンは、この翻訳についてであり、プログラムを手動でトレースし、命令がデータをどこにあるかを示す5つの方法について解説します。
マシンコードとアセンブリ言語
- プロセッサはマシンコードを実行します:特定のアーキテクチャ固有のビットパターンであり、それぞれが操作コードとオペランドを含みます。
- アセンブリ言語は可読性の高い形式です。各命令は
LDD、ADD、またはJMPのような記憶しやすい略称(mnemonic)で書かれ、各アセンブリ命令はちょうど1つのマシンコード命令に変換されます。 - アセンブラがこれを翻訳します。関係は1対1であり、これがアセンブリ言語が高水準言語と異なる点です(高水準言語では1つの文が複数の命令になります)。

各記憶しやすい略称が1つの操作コードになり、各記号付きアドレスが数値になります
Assembly language is:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
Assembly uses mnemonics and maps one-to-one to machine code; an assembler translates it.
2パス・アセンブラ
- Pass 1 はソースを読み込んで記号テーブルを構築します:
LOOP:のようなラベルが出現するたびに、そのアドレスが記録されます。コードは生成されません。 - Pass 2 はソースを再度読み込んでコードを生成し、各記憶しやすい略称を操作コードに置き換え、各記号付きアドレスを記号テーブルからの数値に置き換えます。
- 前方参照のため2回のパスが必要である:
JMP LOOPはLOOP:の行がまだ処理されていない段階で出現する可能性があるため、最初のパスではそのアドレスを把握できない。
What does pass 1 of a two-pass assembler do?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
Pass 1 records where each label is (the symbol table); pass 2 then generates code, using the table to resolve label references.
Put the two-pass assembler's work in order.
難易度 3/5 · 200 コイン + 今日初回完了時に小ボーナス付与
Pass 1 finds all the labels first, so pass 2 can resolve even a jump to a label defined later.
Why does the assembler need two passes?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
A jump may target a label that appears later in the source; pass 1 finds all labels first so pass 2 can resolve them.
演習例:2パスの適用
- プログラムはアドレス100から開始します。
100 LDD COUNT
101 LOOP: DEC ACC
102 CMP #0
103 JPN LOOP
104 END
105 COUNT: 5
- Pass 1 は各行のアドレスをカウントし、ラベルを記録します:
LOOP= 101、COUNT= 105。他には何も書き込まれません。 - Pass 2 は行ごとに翻訳します。
LDD COUNTはLDDに対する操作コードとなりオペランド105を持ちます;JPN LOOPはJPNに対する操作コードとなりオペランド101を持ちます。Pass 1がなければ、最初の行は翻訳できませんでした。
How a two-pass assembler works
Step through it. The assembler reads your code twice: pass 1 just finds where every label lives, so pass 2 can fill in the addresses — that is how a jump to a label defined later still works.
In the worked example, pass 1 records the label LOOP with the address ____ in the symbol table.
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
The program starts at 100, so the second line, LOOP: DEC ACC, occupies 101. COUNT, on the sixth line, is 105.
命令セット
- キャンブリッジ大学の命令セットには、積算器 ACC という1つの汎用レジスタと、インデックスレジスタ IX が存在する。演算数は
#nが十進数、Bnが二進数、&nが十六進数、<address>がメモリ位置番号またはラベルである。 - データ移動:
LDM #n,LDD <address>,LDI <address>,LDX <address>,LDR #n,MOV IX,STO <address>。入出力:IN,OUT。 - 算術演算:
ADD,SUB,INC,DEC。比較:CMP,CMI。ジャンプ:JMP無条件、JPEおよびJPN条件付き。ビット操作:AND,OR,XOR,LSL,LSR。次にEND。 - 「命令はグループ化されている」:グループ名を挙げ、各グループから1つの命令を挙げてください。
Which of these are groups in the instruction set? Select all that apply.
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
Data movement, input/output, arithmetic, compare, conditional and unconditional jumps, and bit manipulation. A spreadsheet is application software, far above this level.
演習例:プログラムのトレース
- ACCとプログラムが使用するすべてのメモリアドレスの列を持つ表を描き、
ENDまで行ごとに更新してください。
100 LDM #0
101 STO TOTAL
102 LDD TOTAL
103 ADD #5
104 STO TOTAL
105 LDD COUNT
106 DEC ACC
107 STO COUNT
108 CMP #0
109 JPN 102
110 END
111 TOTAL: 0
112 COUNT: 3
- ループのPass 1: ACC 0 → 5 (TOTAL = 5)、COUNT 3 → 2、比較不等、ジャンプ。Pass 2: TOTAL = 10、COUNT = 1、ジャンプ。Pass 3: TOTAL = 15、COUNT = 0、比較等価、ジャンプなし、
END。 - 最終値: TOTAL = 15、COUNT = 0、ACC = 0。値が変わったときだけ新しい行を書き、比較を絶対にスキップしないでください。
In the traced program, what is the value of TOTAL when END is reached?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
The loop adds 5 to TOTAL once for each of the three passes: 5, 10, 15.
アドレッシングモード
- アドレッシングモードは、プロセッサがオペランドをどのように見つけるかを示します。
| モード | オペランドの場所 | 例 |
|---|---|---|
| 即座のアドレッシング | 値自体が命令に含まれる | LDM #10 が 10 をロード |
| 直接アドレッシング | 命令にアドレスが含まれており、そこに格納された値を使用する | LDD 200 が 200 の内容 로드 |
| 間接アドレッシング | アドレスが別のアドレスを持ち、それがデータを保持している | LDI 200 |
| インデックスアドレッシング | 有効アドレス = 指定されたアドレス + インデックスレジスタ | LDX 200 with IX |
| 相対アドレッシング | アドレスは現在の命令からのオフセットである | ジャンプ |

同じオペランド・フィールド、4つの異なる意味
In immediate addressing (e.g. LDM #10), the operand is:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
Immediate addressing uses the literal value in the instruction (here, 10).
Match each addressing mode to its meaning.
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
Immediate = value; direct = address of the value; indirect = address of an address; indexed = base + index.
演習例:1つのオペランド、4つの答え
- メモリ: ロケーション200は300を保持、ロケーション300は7を保持、ロケーション202は9を保持。インデックスレジスタIXは2を保持しています。
LDM #200が 200 をACCに入れる:即座のアドレッシング、数値そのもの。LDD 200が 300 をACCに入れる:直接アドレッシング、200の内容。LDI 200が 7 をACCに入れる:間接アドレッシング、200に見つかったアドレスの内容。LDX 200がIXを200に加えて202の内容をロードする:9。同じオペランドが4通りで書かれており、4つの異なる値。
インデックス・アドレッシングが存在する理由
- 配列は連続したロケーションの連なりです。
LDX 200に IX = 0, 1, 2, … を使用すると、命令を変えずに要素0, 1, 2, … を読み取ることができます。 - ループパターン:
LDR #0でインデックスをゼロに、LDX ARRAYで要素を取得し、何かを実行し、INC IXで長さと比較し、JPNに戻ります。 - 直接指定では各要素ごとに別指令が必要ですが、索引指定では1つで済みます。
Indexed addressing is most useful for:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
The effective address is base address + index register, so increasing the index walks through an array.
比較とジャンプ
CMP #nまたはCMP <address>は ACC と値を比較してフラグを設定します。ACC は変更されません。JPE <address>は最後の比較で値が等しかった場合にジャンプし、JPN <address>は等しくなかった場合にジャンプし、JMP <address>は常にジャンプします。- 高レベル言語の
IFはCMPに続き条件付きジャンプになります。ループは比較とラベルへのジャンプに戻りになります。
CMP #0 changes the value held in the accumulator.
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
A compare only sets the flag that the next conditional jump reads. The ACC is unchanged, which is why the trace shows no new ACC value on a CMP line.
見落としやすいポイント
LDM #10は数値 10 を読み込みます;LDD 10は位置 10 の内容を読み込みます。#が全体の違いです。#は十進法、Bは二進法、&は十六進法です。AND &0FとAND B00001111は同じマスクです;AND #15も同様です。CMPは ACC をそのままにし、フラグだけを設定します。JPNは値が等しくない場合にジャンプします。- アセンブラの第1パスでは コードを書きません。出力はシンボルテーブルであり、前方参照が存在する理由です。
理解できましたか
- 機械語はビットパターンです;アセンブリは助記符で、一対一に対応し、アセンブラによって翻訳されます。
- 2つのパス: パス1はラベルアドレスの シンボルテーブル を構築し、パス2はコードを生成します;前方参照のために必要です。
- トレースは ACC とすべての位置の表を使用し、変化ごとに1行ずつ表示します;CMP がフラグを設定し、JPE/JPN がそれを読みます。
- 指定方式: 即座指定
#nで値 · 直接指定 でアドレスの内容 · 間接指定 でアドレスのアドレス · 索引指定 でアドレス + IX (配列) · 相対指定 でオフセット