『情報処理入門 アセンブラ言語編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
- ASCII:
#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 | PUSH | r,adr[, x] | SP←(SP) -L 1, (SP)←実効アドレス |
- POP命令:スタックからデータを取り出す
※格納できるレジスタは、GR0からGR7
命令 | 書き方 | 命令の説明 | |
命令コード | オペランド | ||
ポップ POP | POP | r | r←(SP) SP←(SP) -L 1, |
#04:サブルーチンとスタックの関係を理解しよう
- サブルーチンとは
- 他のプログラムから呼び出す共通のコード
- CALL命令でサブルーチンを呼び出し
- サブルーチンにRET命令があると、呼び出し側に戻る
- CALL命令の次のコードから処理を再開する - RubyやPython・Javaなどの関数・メソッドとの違い
- 引数やローカル変数はない
- 必要なデータがあれば、レジスタを退避する
- 他のプログラムから呼び出す共通のコード
- サブルーチンとスタックの関係
- マシン語のプログラム
- プログラムレジスタのコードを実行する
- 分岐命令があると、プログラムレジスタの値を書き換える - CALL命令でサブルーチンを呼び出し
- 現在のプログラムレジスタの値を、スタックにプッシュする
- プログラムレジスタの値を、サブルーチンのアドレスに書き換える - RET命令でサブルーチンから復帰
- スタックのアドレスをプログラムレジスタに読み込む
- マシン語のプログラム
#05:サブルーチンを呼び出そう
- CALL命令:指定のサブルーチンを呼び出す
命令 | 書き方 | 命令の説明 | |
命令コード | オペランド | ||
コール CALL subroutine | CALL | adr[, 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は演習課題がないから、最後の演習課題のある8で認定証が授与されるようになってるんだな😲
シフト演算で掛け算を計算するのは、結構高度な内容だな😫
学習ステータス
若手から一気に?一流吟遊詩人にランクアップ!?
楽器もギターから竪琴に変化した!😁
※コメント投稿者のブログIDはブログ作成者のみに通知されます