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

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

paizaラーニング『情報処理入門 アセンブラ言語編04: アセンブラ言語でプログラムを作ろう (全10回) 』を受講してみた

2021-02-03 12:57:29 | paiza

『情報処理入門 アセンブラ言語編04: アセンブラ言語でプログラムを作ろう (全10回) 』


アセンブラ言語もこれで最後のレッスンかぁ。
たぶん今後自分でプログラミングすることはないだろうけど、
なんとなくエッセンスはわかったような気がする。

大学で理系(理学部?情報科学部?)を卒業した人たちは、
このようなことを学んできたのかな?
同じプログラミング言語習得するのにも、
そりゃ差がつくだろう、ってことを改めて痛感したな😣 

いっちょ気合い入れて、最後のレッスンに臨むとするか😤 

#01:文字コードを理解しよう

  • 文字コードとは:
    コンピュータで文字を扱うため、1文字ごとにあたえた識別番号
    • 「1」 ⇒ 0011 0001、#31=49
    • 「A」 ⇒ 0100 0001、#41=65
  • 共通の文字コード
    - 多くのコンピュータやソフトウェアは、共通の文字コード表を使う
    - いくつかの種類がある
    • - どの言語のどの文字を収録するか
    • - どのように識別番号を割り当てるか
  • 代表的な文字コード
    • ASCII:
      - 英数字や記号
      - 改行などの制御文字
      - 7ビットであらわす
    • JIS X 0201:ASCIIを8ビットに拡張
      - ASCIIを8ビットに拡張・修正
      - 8ビット領域にカタカナと句読点や濁点・半濁点を追加
      - 「\」(バックスラッシュ)を「¥」(エンマーク)に、
      - 「~」(チルダ)を、「‾」(オーバーライン)に置き換え
      - CASLⅡとCOMETⅡで利用
    • 1バイト文字 > 最大8ビット = 1バイトで表現できる文字コード
      - 最大256文字
      - 漢字が使えない
      - ASCII, JIS X 0201
    • マルチバイト文字 > 漢字や多言語をあつかう
      - UTF-8、UTF-16

#02:スタックポインタの役割を理解しよう

  • スタックとは
    スタック(Stack):データを一時的に退避させる仕組み
    - 入ってきた順番に、積み重ねる
    - 取り出すときは、最後に入れたものから取り出す
    - 後から入れたものを先に出す(LIFO: Last In First Out)、
      先に入れたものを後から出す(FILO: First In Last Out)
  • スタックの基本操作
    - Push:スタックにデータを入れる
    - Pop :スタックからデータを取り出す
  • スタックの用途
    - レジスタ値の一時保存
    - サブルーチンの呼び出し
  • スタックポインタ(SP)とは
    スタックを実現するためのレジスタ
    - 16ビットで、メモリアドレスを保持する
    - メモリに、スタック領域を確保しておく
  • スタックポインタの動作
    最初に、スタックポインタは、スタック領域の最終アドレスの「+1」を保持
    - データをPush:
    スタックポインタの値を「-1」
    現在のスタックポインタのアドレスにデータを格納
    - データをPop:
    現在のスタックポインタのアドレスからデータを取り出す
      スタックポインタの値を「+1」
  • COMETⅡのスタック命令
    - PUSH/POP:スタックに値を出し入れする機械語命令。
    - CALL/RET:サブルーチンを呼び出す、サブルーチンから戻るための機械語命令
    - RPUSH/RPOP:GR1 - GR7の値をスタックに出し入れするマクロ命令。GR0は格納できない。

#03:スタックに値を保存してみよう

  • PUSH命令:スタックに値を入れる
    - レジスタの値だけをスタックに積む: PUSH 0, GR1
    - 指定の値をスタックに積む: PUSH #FF
    - ラベルの値をスタックに積む: PUSH DATA
    ※保存できるレジスタは、GR1 - GR7、GR0は格納できない。
命令書き方命令の説明
命令コードオペランド
プッシュ
PUSH
PUSHr,adr[, x]SP←(SP) -L 1,
(SP)←実効アドレス
  • POP命令:スタックからデータを取り出す
    ※格納できるレジスタは、GR0からGR7
命令書き方命令の説明
命令コードオペランド
ポップ
POP
POPrr←(SP)
SP←(SP) -L 1,

#04:サブルーチンとスタックの関係を理解しよう

  • サブルーチンとは
    • 他のプログラムから呼び出す共通のコード
      - CALL命令でサブルーチンを呼び出し
      - サブルーチンにRET命令があると、呼び出し側に戻る
      - CALL命令の次のコードから処理を再開する
    • RubyやPython・Javaなどの関数・メソッドとの違い
      - 引数やローカル変数はない
      - 必要なデータがあれば、レジスタを退避する
  • サブルーチンとスタックの関係
    • マシン語のプログラム
      - プログラムレジスタのコードを実行する
      - 分岐命令があると、プログラムレジスタの値を書き換える
    • CALL命令でサブルーチンを呼び出し
      - 現在のプログラムレジスタの値を、スタックにプッシュする
      - プログラムレジスタの値を、サブルーチンのアドレスに書き換える
    • RET命令でサブルーチンから復帰
      - スタックのアドレスをプログラムレジスタに読み込む

#05:サブルーチンを呼び出そう

  • CALL命令:指定のサブルーチンを呼び出す
命令書き方命令の説明
命令コードオペランド
コール
CALL subroutine
CALLadr[, x]SP←(SP) -L 1,
(SP)←(PR)
PR←実効アドレス
  • RET命令:呼び出し元に戻る
命令書き方命令の説明
命令コードオペランド
リターン
RETurn from
subroutine
RET
PR←((SP))
SP←(SP) +L 1

#06:スタックにレジスタの値を保存しよう

  • RPUSH命令:レジスタの値をまとめてスタックに入れるマクロ命令
    • GR1からGR7の値を、この順番でスタックにPUSHする
命令書き方命令の説明
命令コードオペランド
レジスタプッシュ
Register PUSH
RPUSH

  • RPOP命令:スタックの値をまとめてレジスタに取り出すマクロ命令
    • GR7からGR1の値を、この順番でスタックからPOPする
命令書き方命令の説明
命令コードオペランド
レジスタポップ
Register POP
RPOP

  • RPUSH命令とRPOP命令の役割
    • サブルーチンを呼び出し
      - プログラムレジスタの値をスタックに格納
      - 戻り先のアドレスを一時退避
    • サブルーチンは、レジスタの値は退避しない
      - サブルーチンの作業用にレジスタを使う
      - レジスタの値が変わってしまう
    • RPUSHで、GR1からGR7の値を一時退避 > RPOPで復帰
      - 元の処理に戻ったとき、レジスタの値をそのまま使える
      - GR0で、サブルーチンの処理結果を受け取る

#07:掛け算プログラムを作ろう - その1

  • 掛け算の求め方
    • 掛け算は、足し算の繰り返し
      10進数:3 x 4 > 3 + 3 + 3 + 3
       2進数:11 x 100    >   11 + 11 + 11 + 11
  • 足し算の繰り返しで、掛け算する手順
    1. 計算結果を初期化
    2. 掛けられる数を用意する
    3. 掛ける数を用意する

    4. 計算結果に、掛けられる数を足す
    5. 掛ける数を1減らす
    6. ゼロでなかったら、4にもどる

    7. 終了

#08:掛け算プログラムを実行しよう - その1

  • 先程作ったプログラムを実行する
  • リテラル表記
    数値の前に「=」を書くと、CASLⅡがDC命令を自動的に生成します。そして、この数値をデータ領域に配置します。リテラル表記で記述したコードでは、そのアドレスからデータを読み込みます。
  • サブルーチンのデータ領域
    データ領域は、メインルーチンとサブルーチンで、それぞれ記述します。CASLⅡでは、自分のコードのデータ領域だけアクセスできます。つまり、メインルーチンで、DATA1やDATA2にアクセスできますが、サブルーチンからDATA1にアクセスできません。このおかげで、ルーチンでラベル名が重複できます。

#09:掛け算プログラムを作ろう - その2

  • シフトで掛け算する手順
    1. 計算結果を初期化
    2. 掛けられる数を用意する
    3. 掛ける数を用意する

    4. 掛ける数の最下位ビットが「1」か調べる
    5. 「0」だったら、7にジャンプ

    6. 計算結果に、掛けられる数を足す

    7. 掛けられる数を1ビット左にシフトする
    8. 掛ける数を1ビット右にシフトする

    9. ゼロでなかったら、4にもどる

    10. 終了

#10:掛け算プログラムを実行しよう - その2

  • Chap09で作ったプログラムを実行する

認定証

全10レッスンあるはずだが、レッスン8を終えたところで、認定証を取得
おそらくレッスン9と10は補講で後から追加されたのだろう
→ レッスン9と10は演習課題がないから、最後の演習課題のある8で認定証が授与されるようになってるんだな😲 


シフト演算で掛け算を計算するのは、結構高度な内容だな😫 

学習ステータス

若手から一気に?一流吟遊詩人にランクアップ!?

楽器もギターから竪琴に変化した!😁 

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« paizaラーニング『情報処理入... | トップ | paizaラーニング『C言語入門... »
最新の画像もっと見る

コメントを投稿

paiza」カテゴリの最新記事