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

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

paizaラーニング『情報処理入門 アセンブラ言語編03: アセンブラ言語の命令を理解しよう (全9回)』を受講してみた

2021-02-02 22:09:20 | paiza

『情報処理入門 アセンブラ言語編03: アセンブラ言語の命令を理解しよう (全9回)』


アセンブラ言語、手強い😫 

これはきちんと勉強した方が良さそうだな😅 

Tipsを改めて確認したところ、
アセンブラ言語CASLⅡの仕様として以下のサイトが紹介されており、
リンク先ではWeb版のシミュレータも利用することができる。

リンク先をちゃんと確認してからの方が良さそうだけど、
とりあえず続きを始めよう。

#01:アセンブラ命令を理解しよう

  • 命令コードの種類
    • 機械語命令
      - CPUを直接操作する命令
      - 機械語に変換される
      - 例:LD、ADDA、ST、RET
    • アセンブラ命令
      - アセンブラに対して指示をする
      - 開始アドレスや、ラベルを置き換える
      - 例:START、END、DC、DS
    • マクロ命令
      - あらかじめ用意されたプログラムを呼び出し
      - 例:IN、OUT
  • START命令:プログラムの先頭を定義
    - 実行開始番地で、プログラムの実行を開始するアドレスを指定できる
    - 実行開始番地を省略した場合は、STARTの次の命令から実行を開始する
    - START命令の前のラベルは、このプログラムを他から呼び出す場合に指定する
START     [実行開始番地]
  • END命令:プログラム全体の終わりを定義
    - コードの末尾をあらわす
    - RETの次からENDまでがデータ領域
END

#02:マクロ命令でキーボード入力しよう

  • DC命令:データ領域に値を格納する

    DC      定数

    - データ領域を確保し、そこに値を配置する
    - 定数には、10進数・16進数・文字定数・ラベルを指定
    - 10進数:符号付き2進数 −32768 〜 32767
    - 16進数:4桁の16進数、先頭に「#」を付ける
    - 文字定数:文字数分の領域を確保し、文字データを格納する。アポストロフィで囲む
    - アドレス:ラベルに対応するアドレスを格納する
    - 格納した値を読み込むには、ラベルを利用する
  • DS命令:データ領域を確保する

    DS      語数

    - 語数は、10進数で記述する。指定した語数のメモリ領域を確保
    - 値のアクセスは、ラベルを利用する
  • OUT命令:テキストを出力する

    OUT     出力領域, 出力文字長領域

    - 割り当てられた出力装置に、文字データを書き出す
    - 出力領域:文字定数が格納された領域のラベルを指定する
    - 出力文字長領域:出力する文字数を格納する領域のラベルを指定
  • IN命令:テキストを入力する

    IN      入力領域, 入力文字長領域

    - 割り当てられた入力装置から、文字データを入力する
    - paizaラーニングでは、キーボードから文字を入力
    - 入力領域:入力文字を格納する領域のラベルを指定
    - 入力文字長領域:入力した文字数を格納する領域のラベルを指定

#03:算術加算と論理加算をやってみよう

  • ADDA命令
    算術加算:16ビットの符号付き2進数として加算をおこなう
    - 演算範囲は、-32768(#8000) ~ 32767(#7FFF)
    - 演算結果がこの範囲を超えると、OFが「1」になる
    - レジスタ間の加算と、レジスタ・メモリ間の加算ができる
  • ADDL命令
    論理加算:16ビットの符号なし2進数として加算をおこなう
    - 演算範囲は、0 ~ 65535(#FFFF)
    - 演算結果がこの範囲を超えると、OFが「1」になる
    - レジスタ間の加算と、レジスタ・メモリ間の加算ができる

#04:算術減算と論理減算をやってみよう 

  • SUBA命令
    算術減算:符号付き2進数として減算をおこなう
    - 演算範囲は、-32768 ~ 32767
    - 演算結果がこの範囲を超えると、OFが「1」になる
    - レジスタ間の減算と、レジスタ・メモリ間の減算ができる
  • SUBL命令
    論理減算:符号なし2進数として減算をおこなう
    - 演算範囲は、0 ~ 65535
    - 演算結果がこの範囲を超えると、OFが「1」になる
    - レジスタ間の減算と、レジスタ・メモリ間の減算ができる

#05:AND命令とOR命令の役割を理解しよう

  • AND命令
    - 16ビットのAND演算
    - 演算結果に合わせてサインフラグとゼロフラグが変化する
    オーバーフローフラグは「0」になる
    - レジスタ間と、レジスタ・メモリ間で演算できる
命令書き方命令の説明
命令コードオペランド
論理積
AND
ANDr1,r2r1←(r1) AND (r2)
r,adr[,x]r1←(r) AND (実効アドレス)
  • OR命令
    - 16ビットのOR演算
    - 演算結果に合わせてサインフラグとゼロフラグが変化する
    オーバーフローフラグは「0」になる
    - レジスタ間と、レジスタ・メモリ間で演算できる
命令書き方命令の説明
命令コードオペランド
論理和
OR
ORr1,r2r1←(r1) OR (r2)
r,adr[,x]r1←(r) OR (実効アドレス)
  • AND命令の使い道
    • 特定ビットの0/1を判別
      - 組み込み機器で、特定のメモリアドレスに、スイッチやセンサーを接続
      - そのオン(1)/オフ(0)を判別したい
      - 判別したいビットだけ「1」、残りを「0」にして、ANDで演算する
    • 特定ビットを「0」に設定
      - 組み込み機器で、特定のメモリアドレスに、LEDや出力装置を接続
      - そのビットをオフ(0)に設定したい
      - 設定したいビットだけ「0」、残りを「1」にして、ANDで演算する
  • OR命令の使い道
    • 特定ビットを「1」に設定
      - 組み込み機器で、特定のメモリアドレスに、LEDや出力装置を接続
      - そのビットをオン(1)に設定したい
      - 設定したいビットだけ「1」、残りを「0」にして、ORで演算する

#06:AND命令とOR命令を使ってみよう

  • 実際にコーディング

#07:排他的論理和でビットを反転しよう

  • XOR命令
    - 16ビットのExclusive OR演算(排他的論理和)
    - 演算結果に合わせてサインフラグとゼロフラグが変化する
    オーバーフローフラグは「0」になる
    - レジスタ間と、レジスタ・メモリ間で演算できる
命令書き方命令の説明
命令コードオペランド
排他的論理和
XOR
XORr1,r2r1←(r1) XOR (r2)
r,adr[,x]r1←(r) XOR (実効アドレス)
  • XOR命令の使い道
    • 特定ビットを反転
      - 特定のビットを反転、つまり「0」→「1」、「1」→「0」に設定したい
      - 設定したいビットだけ「1」、残りを「0」にして、XORで演算する
      - 組み込み機器で、特定のメモリアドレスに、LEDや出力装置を接続
※ 2個めの演習課題がムズい😭 

#08:シフト演算命令 - その1

  • シフト演算命令:レジスタの値を指定ビット分、移動させる
    • 算術シフト:符号ビットを含まずにシフトする
      - SLA命令:左方向に算術シフト
      - SRA命令:右方向に算術シフト
    • 論理シフト:符号ビットを含めてシフトする
      - SLL命令:左方向に論理シフト
      - SRL命令:右方向に論理シフト
  • 左方向に算術シフト
    SLA     SLA r, adr [, x]

    - 符号ビットを含まずに、ビットパターンを左方向に移動
    - 右側の空いたビットは「0」になる
    - 左側のはみ出したビットは削除される
    - 最後にはみ出したビットをOFにセット
    - シフトする量を、実効アドレスで指定する
     SLA GR0, 1 ; 1ビット左に算術シフト
     SLA GR0, 2 ; 2ビット左に算術シフト
  • 右方向に算術シフト
    SRA     SRA r, adr [, x]

    - 符号ビットを含まずに、ビットパターンを右方向に移動
    - 左側の空いたビットは、符号ビットと同じ値になる
    - 右側のはみ出したビットは削除される
    - 最後にはみ出したビットをOFにセット
    - シフトする量を、実効アドレスで指定する
     SRA GR0, 1 ; 1ビット右に算術シフト
     SRA GR0, 2 ; 2ビット右に算術シフト

#09:シフト演算命令 - その2

  • 左方向に論理シフト
    SLL SLL r, adr [, x]

    - 符号ビットを含めて、ビットパターンを左方向に移動
    - 右側の空いたビットは「0」になる
    - 左側のはみ出したビットは削除される
    - 最後にはみ出したビットをOFにセット
    - シフトする量を、実効アドレスで指定する
     SLL GR0, 1 ; 1ビット左に論理シフト
     SLL GR0, 2 ; 2ビット左に論理シフト
  • 右方向に論理シフト
    SRL SRL r, adr [, x]

    - 符号ビットを含めて、ビットパターンを右方向に移動
    - 左側の空いたビットは「0」になる
    - 右側のはみ出したビットは削除される
    - 最後にはみ出したビットをOFにセット
    - シフトする量を、実効アドレスで指定する
     SRL GR0, 1 ; 1ビット右に論理シフト
     SRL GR0, 2 ; 2ビット右に論理シフト
  • NOP命令 No Operation:何もしない
    - 実際のCPUでは、命令1個分の時間を消費する
    - 実行時のタイミング調整や、ダミー命令に利用する

認定証



学習ステータス

駆け出しから若手吟遊詩人に昇格

ところで、吟遊詩人って強いのか?😬 
楽器でモンスターと戦えるんだろうか?😁 


最新の画像もっと見る

コメントを投稿