270 likes | 432 Views
コンピュータアーキテクチャ. 第 3 回. オブジェクトプログラムの略記. オブジェクトプログラム アドレス:機械語:第2語 ↓ ↓ ↓ #1000: #1050 #1007 #1002: #2050 #1008 #1004: #1150 #1009 #1006: #8100 #1007: #0014 #1008: #000C #1009: #0000.
E N D
コンピュータアーキテクチャ 第 3回
オブジェクトプログラムの略記 オブジェクトプログラム アドレス:機械語:第2語 ↓ ↓ ↓ #1000: #1050 #1007 #1002: #2050 #1008 #1004: #1150 #1009 #1006: #8100 #1007: #0014 #1008: #000C #1009: #0000 ソースプログラム ラベル ニモニック オペランド PLUS START LD GR5,DATA1 ADDA GR5,DATA2 ST GR5,RESULT RET DATA1 DC 20 DATA2 DC 12 RESULT DS 1 END ソースプログラムとオブジェクトプログラムを対比し易くするため,2ワード命令の第2語を第1語のあとに付けアドレスを省略
比較演算命令 • レジスタ間命令 • メモリ・レジスタ間命令 • の両方あり CPA GR2, #1000 ・・・ (ComPare Arithmetic) CPL GR2, #1000 ・・・ (ComPare Logical) 第1オペランドの値と 第2オペランドの値を 比較 第1 < 第2 なら SF は 1 第1 = 第2 なら ZF は 1 * 比較演算命令 実行時は 常に OF は 0 #000A < #0014
分岐命令 正分岐 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) • 分岐命令によってフラグレジスタは変化しない • フラグレジスタ FR の値によってプログラムレジスタ PR へ実効アドレスをわたす *
分岐条件(フラグレジスタ) OF SF ZF JPL 0 & 0 JMI 1 JNZ 0 JZE 1 JOV 1
1 から 10 の整数の総和を計算し GR0 へ格納する
CASLⅡ のエミュレーションソフト • CaslBuilder ・・・ フリーウェア • Windows7, xp 等で動作 • http://www.vector.co.jp/soft/win95/prog/se059919.html • Mac OS でもインストール可能 • http://mikuinstaller.sourceforge.jp/ • CASL2000 ・・・ フリーウェア • Windows98, 2000, xp 等のうえで CASLⅡ の動作環境をエミュレーション • http://www5a.biglobe.ne.jp/~teamcasl/ 等で入手可能 • CASLⅡシミュレータ ・・・ フリーウェア • 情報処理技術者試験センター提供 • Windows7 未対応
JIS 情報交換用符号(JIS X 0201) 例: ‘&’ = # 2 6 ‘3’ = # 3 3 ‘A’ = # 4 1 ↑↑ 列行 ‘&’ = # 0 0 2 6 ‘3’ = # 0 0 3 3 ‘A’ = # 0 0 4 1 * X 0201 では * 1 ワードの中では
二つの数字を二つの数値に変換してそれらの積を求める.二つの数字を二つの数値に変換してそれらの積を求める.
単語の中の特定文字数を数える = #0063 = #006F = #006D = #0070 = #0075 = #0074 = #0065 = #0072
文字データの入出力 • マクロ命令 IN, OUT を使用 • パラメータ • 入力領域: 1 レコード = の入力データ格納領域 • 入力文字長領域: を格納 • 出力領域: 1 レコードの出力データ格納領域 • 出力文字長領域: を格納 • 命令書式 IN 入力領域,入力文字長領域 OUT 出力領域,出力文字長領域 * 256 ワード * 入力文字数 * 出力文字数
大文字と小文字の変換 標準入出力装置から 英字をひとつ読み, 大文字は小文字に, 小文字は大文字に 変換する
論理積・論理和・排他的論理和命令 AND GR2, #1000 ・・・ (AND) OR GR2, #1000 ・・・ (OR) * XOR GR2, #1000 ・・・ (eXclusive OR) • レジスタ間命令 • メモリ・レジスタ間命令 の両方あり AND, OR, XOR 命令 では OF は常に 0 13
演習問題 3.1 テキストの<プログラム 2>開始から終了までに,GR0 および GR1 の値がどのように変化するか順番に示せ.ただし,どちらかのレジスタが変化するごとにその直後の値を16進数で示すこと.
演習問題 3.2 テキスト p59 の演習問題 (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 にはレジスタから *送り出されたビットの値を入れる • レジスタの右側の空いたビット位置には *を入れる 符号ビット 消失 最後に 0
SLA による 2 のべき乗倍 SLA GR1, 2 ・・・ (GR1) = 5 レジスタ GR1 の値 *を 4 倍(2 の 2 乗倍)して *とする (5)10 (20)10
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 * ← 4 を 2 ビット左シフト ← 4 の シフトなしを加算 *
A の値を 5 倍して B へ格納するプログラム * ← GR1 の値を 22 倍 * ← GR1 に A の 20 倍を加算
正整数 A, B の積を計算する方法 A = a14 * 214 + a13 * 213 + ・・・ + a2 * 22 + a1 * 21 + a0 * 20 * ← 16 ビット符号つき 2 進数 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 をカウンタとして初期化 ← 結果を累積保存 * ← GR5 の第 0ビットだけを 1 * ← B の第 i ビットを抽出 ← 終了判定 (GR1 = 15 ?) * ← GR5 を 1 ビット左シフト ← GR6 を 2倍
演習問題 3.7 前出の <プログラム 7 > の開始から終了までに GR7 の値がどのように変化するか順番に示せ.