コンピュータアーキテクチャ 第 3 回
オブジェクトプログラムの略記 ソースプログラム ラベル ニモニック オペランド PLUS START LD GR5,DATA1 ADDA GR5,DATA2 ST GR5,RESULT RET DATA1 DC 20 DATA2 DC 12 RESULT DS 1 END オブジェクトプログラム ↓ ↓ ↓ #1000: #1050 #1007 #1002: #2050 #1008 #1004: #1150 #1009 #1006: #8100 #1007: #0014 #1008: #000C #1009: #0000 アドレス: 機械語の第1語 機械語の第2語 ソースプログラムとオブジェクトプログラムを対比し易くするため,2ワード命令の第2語を第1語のあとに付けアドレスを省略
比較演算命令 CPA GR2, #1000 ・・・ (ComPare Arithmetic) レジスタ間命令 メモリ・レジスタ間命令 の両方あり CPA GR2, #1000 ・・・ (ComPare Arithmetic) CPL GR2, #1000 ・・・ (ComPare Logical) 第1オペランドの値と 第2オペランドの値を 比較 * 比較演算命令 実行時は 常に OF は 0 #000A < #0014
分岐命令 正分岐 JPL adr[,X] ・・・ (Jump on PLus) * 正分岐 JPL adr[,X] ・・・ (Jump on PLus) 負分岐 JMI adr[,X] ・・・ (Jump on MInus) 非零分岐 JNZ adr[,X] ・・・ (Jump on Non Zero) 零分岐 JZE adr[,X] ・・・ (Jump on ZEro) オーバフロー分岐 JOV adr[,X] ・・・ (Jump on OVerflow) 無条件分岐 JUMP adr[,X] ・・・ (Unconditional JUMP) 分岐命令によってフラグレジスタは変化しない
分岐条件(フラグレジスタ) OF SF ZF JPL 0 & 0 JMI 1 JNZ 0 JZE 1 JOV 1
1 から 10 の整数の総和を計算し GR0 へ格納する
CASLⅡ のエミュレーションソフト CaslBuilder ・・・ フリーウェア CASL2000 ・・・ フリーウェア COMETⅡ, CASLⅡを理解するために強く推奨! Windows7, 10 等で動作 ⇒ http://www.vector.co.jp/soft/win95/prog/se059919.html Mac OS でもインストール可能 ⇒ http://mikuinstaller.sourceforge.jp/ CASL2000 ・・・ フリーウェア Windows98, 2000, xp 等のうえで CASLⅡ の動作環境をエミュレーション CASLⅡシミュレータ ・・・ フリーウェア 情報処理技術者試験センター提供 Windows7 未対応
JIS 情報交換用符号(JIS X 0201) 例: ‘&’ = # 2 6 ‘3’ = # 3 3 ‘A’ = # 4 1 ↑↑ 列行 ‘&’ = # 2 6 ‘3’ = # 3 3 ‘A’ = # 4 1 ↑↑ 列行 ‘&’ = # 0 0 2 6 ‘3’ = # 0 0 3 3 ‘A’ = # 0 0 4 1 * *
二つの数字を二つの数値に変換して それらの積を求める.
単語の中の特定文字数を数える アルファベットの順番が ‘n’ 以降のものが文字列中にいくつあるか? = #0063 = #006F = #006D = #0070 = #0075 = #0074 = #0065 = #0072
文字データの入出力 マクロ命令 IN, OUT を使用 パラメータ 命令書式 IN 入力領域,入力文字長領域 入力領域: 1 レコード = の入力データ格納領域 入力文字長領域: を格納 出力領域: 1 レコードの出力データ格納領域 出力文字長領域: を格納 命令書式 IN 入力領域,入力文字長領域 OUT 出力領域,出力文字長領域 * * *
大文字と小文字の変換 標準入出力装置から 英字をひとつ読み, 大文字は小文字に, 小文字は大文字に 変換する
論理積・論理和・排他的論理和命令 AND GR2, #1000 ・・・ (AND) OR GR2, #1000 ・・・ (OR) * レジスタ間命令 メモリ・レジスタ間命令 の両方あり AND, OR, XOR 命令 では OF は常に 0 13 13
演習問題 3.1 テキストの<プログラム 2>開始から終了までに,GR0 および GR1 の値がどのように変化するか順番に示せ.ただし,どちらかのレジスタが変化するごとにその直後の値を16進数で示すこと.
演習問題 3.2 テキスト pp.55-56 の演習問題 (8), (9), (10) のプログラムそれぞれの機能を説明せよ.
演習問題 3.3 名前 A でラベル付けされたメモリ領域の値から,名前 B でラベル付けされたメモリ領域の値をひいた値の絶対値を,名前 C でラベル付けされたメモリ領域に格納するプログラムを書きなさい.ただし,領域 A, B には適当な数値を入れておくこと.
演習問題 3.4 標準入出力装置から 4 個の数字を読み込み,4 桁の 10 進数とみなして汎用レジスタ GR2 へ格納するプログラムを示せ.ただし,数字の読み込みには,マクロ命 IN を使うこと.
演習問題 3.5 テキストの<プログラム 3>をアセンブルせよ.
演習問題 3.6 テキストの<プログラム 4>をアセンブルせよ.
シフト演算命令 算術シフト演算命令 * 算術左シフト演算命令 論理シフト演算命令 * 算術右シフト演算命令 論理左シフト演算命令 算術シフト演算命令 * 論理シフト演算命令 * 算術左シフト演算命令 算術右シフト演算命令 論理左シフト演算命令 論理右シフト演算命令
算術左シフト演算命令 SLA GR0, 3 ・・・ (Shift Left Arithmetic) だけ,レジスタの内容を 左へシフト * 最上位の *はシフトしない レジスタの左側から送り出されたビットの値は *する OF にはレジスタから *送り出されたビットの値を入れる レジスタの右側の空いたビット位置には *を入れる
SLA による 2 のべき乗倍 SLA GR1, 2 ・・・ (GR1) = 5
2 進数で値 4 を 5 倍する方法 4 * 5 = 4 * (4 + 1) = 4 * (22 + 20) = 4 * 22 + 4 * 20 4 = #0004 = (0000 0000 0000 0100)2 4 * 22 = (0000 0000 0001 0000)2 4 * 22 + 4 * 20 = (0000 0000 0001 0000)2 + (0000 0000 0000 0100)2 = (0000 0000 0001 0100)2 * *
A の値を 5 倍して B へ格納するプログラム * *
正整数 A, B の積を計算する方法 A = a14 * 214 + a13 * 213 + ・・・ + a2 * 22 + a1 * 21 + a0 * 20 * B = b14 * 214 + b13 * 213 + ・・・ + b2 * 22 + b1 * 21 + b0 * 20 A * B = A * (b14 * 214 + b13 * 213 + ・・・ + b2 * 22 + b1 * 21 + b0 * 20) = b14 * A * 214 + b13 * A * 213 + ・・・ + b2 * A * 22 + b1 * A * 21 + b0 * A * 20 = b14 * A の 14 ビット左シフト + b13 * A の 13 ビット左シフト ・ + b2 * A の 2 ビット左シフト + b1 * A の 1 ビット左シフト + b0 * A の シフトなし
A の値を B 倍する プログラム ← GR1 をカウンタとして初期化 ← 結果を累積保存 * * ← 終了判定 (GR1 = 15 ?)
演習問題 3.7 前出の <プログラム 7 > の開始から終了までに GR7 の値がどのように変化するか順番に示せ.