アセンブラのレッスン2
をやっていく。
前回からそうだけど、今までの2倍速で聞いていた講義も、
1.25倍速で聞くのがやっとだな。
聞き慣れない言葉が結構出てくるからな。
#01:仕様書の読み方を知っておこう
- アセンブラ言語CASLⅡの仕様
言語の仕様
1. CASLⅡは、COMETⅡのためのアセンブラ言語である。
2. プログラムは、命令行および注釈行からなる。
3. 1命令は1命令行で記述し、次の行へ継続できない。
4. 命令行およびコメント行は、次に示す記述の形式で、行の1文字目から記述する。 - COMETⅡの仕様書:機械語命令の詳細
LD命令は、2つの機能があるのでオペランドの書き方が2つある。
命令 | 書き方 | 命令の説明 | |
命令コード | オペランド | ||
ロード LoaD | LD | r1,r2 | r1←(r2) |
r,adr[,x] | r1←(実効アドレス) |
- 記号の役割
- r,r1,r2:いずれもGRを示す。指定できるGRは、GR0~GR7
- adr:アドレスを示す。指定できる値の範囲は0~65535
- x:指標として用いるGRを示す。指定できるGRはGR1~GR7
- [ ]:[ ]内の指定は省略できることを示す。
- ( ):( )内のレジスタ又はアドレスに格納されている内容を示す。
- 実効アドレス:adrとxの内容との論理加算値又はその値が示す番地。
- ←:演算結果を、左辺のレジスタまたはアドレスに格納することを示す。
#02:LAD命令を使ってみよう
- LAD命令:Load ADress
LAD命令は、オペランドに記述したアドレス自体を読み込む命令。
この機能で、オペランドの値を直接レジスタに読み込める。 - 16進表記で記述する
CASLⅡでは、数値の前に「#」をつけると、16進数表記になる。
#03:アドレスの指定方法を理解しよう
- インデックス修飾
「x」には、GR1 ~ GR7のどれかを指定する。
指定すると、adrで指定したラベルに、指定したレジスタの値を足し算して、その計算結果のアドレスから、値をレジスタに読み込む。 - 実行アドレス:インデックス修飾で計算したアドレス
例:ラベルA+GR1
#04:メモリに値をストアしよう
- ST命令
命令 | 書き方 | 命令の説明 | |
命令コード | オペランド | ||
ストア STore | ST | r1,adr[, x] | (実効アドレス)←r |
#05:フラグレジスタの働きを理解しよう
- フラグレジスタの種類
・OF:計算結果がオーバーフローする
・SF:計算結果がマイナスにする
・ZF:計算結果がゼロになる
#06:サインフラグを理解しよう
- 符号付き2進数:2進数で、マイナスをあらわす方法
・+/ー符号ではなく、最上位の1ビット(符号ビット)で正負をあらわす
・正数:最上位ビットが「0」
・負数:最上位ビットが「1」- 2進数で負数を作る場合:マイナスの値は、2の補数で表す
1. 正の数の01を反転:0001→1110
2. 1を足す:1110+1→1111
- 2進数で負数を作る場合:マイナスの値は、2の補数で表す
- SF(Sign Flag):サインフラグ
符号付き2進数の符号フラグをあらわす
演算結果の最上位ビットがゼロのとき「0」、それ以外のとき「1」になる
算術演算、論理演算、LD命令などで変化する
#07:オーバフローフラグを理解しよう
- OF(Overflow Flag):オーバーフローフラグ
- 演算結果の桁あふれをあらわす
演算結果が、16ビットの範囲をこえたとき「1」、それ以外は「0」 - 算術演算命令(ADDA、SUBA)
・符号付き2進数として計算
・演算結果が-32768 ~ 32767を超えた場合に「1」、それ以外は「0」 - 論理演算命令(ADDL、SUBL)
・符号なし2進数として計算
・演算結果が0 ~ 65535を超えた場合に「1」、それ以外は「0」
- 演算結果の桁あふれをあらわす
#08:分岐命令を使ってみよう
- アセンブラ言語にif文はない
→ 分岐命令を使う - COMET2の分岐命令
命令 | 命令コード | オペランド |
正分岐(Jump on PLus) | JPL | adr[,x] |
負分岐(Jump on MInus) | JMI | adr[,x] |
非ゼロ分岐(Jump on Non Zero) | JNZ | adr[,x] |
ゼロ分岐(Jump on ZEro) | JZE | adr[,x] |
オーバーフロー分岐(Jump on OVerflow) | JOV | adr[,x] |
無条件分岐(unconditional JUMP) | JUMP | adr[,x] |
#09:比較命令で分岐してみよう
- 比較命令
命令 | 書き方(命令コード、オペランド) | 説明 |
算術比較 ComPare Arithmetic | CPA r1, r2 CPA r, adr[, x] | r1←r2 r ←(実効アドレス) |
論理比較 ComPare Logical | CPL r1, r2 CPL r, adr[, x] | r1←r2 r ←(実効アドレス) |
- (r1)と(r2)、または(r)と(実効アドレス)を比較して、その結果によって、FRに次の値を設定する
比較 | 比較 | FRの値 | 対応する分岐命令 |
左が右より大きい | (r1)>(r2), (r)>(実効アドレス) | SF: 0, ZF: 0 | JPL |
左と右が等しい | (r1)=(r2), (r)=(実効アドレス) | SF: 0, ZF: 1 | JZE |
左が右より小さい | (r1)<(r2), (r)<(実効アドレス) | SF: 1, ZF: 0 | JMI |
#10:ループプログラムを作ってみよう - その1
- for文などのループ処理はない
→ 分岐命令を使う
#11:ループプログラムを作ってみよう - その2
- データ領域の連続した数値を順番に利用する
→ ループ処理とインデックス修飾を組み合わせる
認定証
やっぱり難しいな😫
多分イチからプログラミングしろと言われたら、無理かもしれない😕
学習ステータス
見習いから駆け出しになった。
※コメント投稿者のブログIDはブログ作成者のみに通知されます