不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

paizaラーニング『 情報処理入門 アセンブラ言語編02: 条件分岐とループをやってみよう (全11回) 』を受講してみた

2021-02-02 12:38:58 | paiza
アセンブラのレッスン2
をやっていく。

前回からそうだけど、今までの2倍速で聞いていた講義も、
1.25倍速で聞くのがやっとだな。
聞き慣れない言葉が結構出てくるからな。

#01:仕様書の読み方を知っておこう

  • アセンブラ言語CASLⅡの仕様
    言語の仕様
    1. CASLⅡは、COMETⅡのためのアセンブラ言語である。
    2. プログラムは、命令行および注釈行からなる。
    3. 1命令は1命令行で記述し、次の行へ継続できない。
    4. 命令行およびコメント行は、次に示す記述の形式で、行の1文字目から記述する。
  • COMETⅡの仕様書:機械語命令の詳細
    LD命令は、2つの機能があるのでオペランドの書き方が2つある。
命令書き方命令の説明
命令コードオペランド
ロード
LoaD
LDr1,r2r1←(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
STr1,adr[, x](実効アドレス)←r

#05:フラグレジスタの働きを理解しよう

  • フラグレジスタの種類
    ・OF:計算結果がオーバーフローする
    ・SF:計算結果がマイナスにする
    ・ZF:計算結果がゼロになる

#06:サインフラグを理解しよう

  • 符号付き2進数:2進数で、マイナスをあらわす方法
    ・+/ー符号ではなく、最上位の1ビット(符号ビット)で正負をあらわす
    ・正数:最上位ビットが「0」
    ・負数:最上位ビットが「1」
    • 2進数で負数を作る場合:マイナスの値は、2の補数で表す
      1. 正の数の01を反転:0001→1110
      2. 1を足す:1110+1→1111
  • 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)JPLadr[,x]
負分岐(Jump on MInus)JMIadr[,x]
非ゼロ分岐(Jump on Non Zero)JNZadr[,x]
ゼロ分岐(Jump on ZEro)JZEadr[,x]
オーバーフロー分岐(Jump on OVerflow)JOVadr[,x]
無条件分岐(unconditional JUMP)JUMPadr[,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

  • データ領域の連続した数値を順番に利用する
    → ループ処理とインデックス修飾を組み合わせる

認定証

やっぱり難しいな😫 
多分イチからプログラミングしろと言われたら、無理かもしれない😕 


学習ステータス

見習いから駆け出しになった。



最新の画像もっと見る

コメントを投稿