Download presentation
Presentation is loading. Please wait.
Published byΑντώνης Δημητρίου Modified 約 6 年前
1
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第1回) 中島 克人
2
授業の概要(1/2) 目的 達成目標 教科書: 玉井浩著「詳解 COMET Ⅱ & CASL Ⅱ」
プロセッサの基本動作を理解する 。 アセンブリ言語によって簡単な処理アルゴリズムを記述できるようになること。 達成目標 プロセッサの基本的な構成要素、各種情報の内部表現法、動作のメカニズム等を理解する。アセンブリ言語によるプログラミングを通じて,機械語やアセンブラの役割、および、アセンブラによる基本的な計算アルゴリズムの構成法を理解する。 教科書: 玉井浩著「詳解 COMET Ⅱ & CASL Ⅱ」 (発行SiB access社、発売 星雲社) 参考書:坂井修一著「コンピュータアーキテクチャ」 (コロナ社)(後続科目の参考書としても利用) 評価方法 3回程度の提出課題、および、期末試験を1:1で評価
3
授業の概要(2/2) 演習について 講義中の演習は、紙と筆記用具で,もしくは, 各自のノートPCで、仮想計算機COMET Ⅱのアセンブラである CASL Ⅱシミュレータ を用いて行う CASL Ⅱシミュレータ は下記,講義ホームページからインストールできる 講義ホームページ 講義の一部を欠席すると,直ぐに付いて行けなくなる恐れが大きい 遅刻・欠席はしないこと 居眠りは欠席と同じ
4
4 SN CS ST 4 専門共通科目 配当期 単位数 図2. 各ユニットに属する専門科目専門科目とその履修順序 (ユニット・ツリー)
図2. 各ユニットに属する専門科目専門科目とその履修順序 (ユニット・ツリー) (コンピュータ系ユニット: SN: Security & Network, ST: Software Technology, CS: Computer & System) 1 2 演習・実習科目 講義を主と する科目 単位数 配当期 1年 ~2年 専門共通科目 2 SN 2 ST 1 2 CS データ記述 とXML 情報 ネットワーク ★ オペレーティング システム ★ プロセッサと 機械語 ★ 2年 2 2 2 論理 回路 1 1 形式言語と オートマトン 情報ネット ワーク演習 ★ クラスライブ ラリ応用 ★ GUI プログラミング コンピュータ アーキテクチャ 1 2 1 2 2 2 2 2 2 情報セキュリティの 基礎と暗号技術 ★ サーバ 設計論 メディア コミュニケーション 人間情報 システム データ ベース サーバプログラ ミング演習 ソフトウェア 設計 視聴覚 応用 1 コンパイラ 3年 1 2 1 デジタル システム設計 2 1 2 データ ベース演習 ネットワーク プログラミング プログラミング 言語論 デジタル システム 設計演習 ネットワーク プログラミング演習 ヒューマン インタ フェース 1 1 データベース プログラミグ ※ ネットワーク セキュリティ 1 2 2 2 2 2 ユビキタス コンピューティング ソフトウェア 分析・モデリング ウィンドウズ プログラミング 情報技術 基礎 人工知能と コンピュータ 1 4年 セキュリ ティ演習 ※ 2 2 2 情報技術 応用 情報 システム論 デジタル データ学 (※:専門共通科目) 実線矢印: 矢印の先の科目を履修するためには、矢印の根元の科目が履修済でなくてはならない 点線矢印: 矢印の先の科目を履修する前に、矢印の根元の科目を履修済としておくことを推奨する なお、それぞれのユニットの網掛け内の科目の内、★印は「ユニット専門科目(必修)」、それ以外が「ユニット専門科目(選択)」である 4 4
5
計算機のしくみ と 計算機の内部表現 プロセッサと機械語 プロセッサの中には? 計算機の構成例 プロセッサの基本動作 プログラムと機械命令
6
まずはコンピュータ(計算機)を 分解してみよう! ..... コンピュータ本体 出力装置: CRT 出力装置: スピーカー 入力装置:
キーボード 入力装置: マウス
7
本体Cabinetの中を覗くと ・・・ ・・ 計算機の (物理)構成例
I/O controller I/O devices DRAM Memory Power Supply Fan Processor
8
(Central Processing Unit)
計算機の (論理)構成例 プロセッサ ( processor ) CPU (Central Processing Unit) CPU = Memory-Bus Cache Controller & Adapter keyboard mouse SIO System Bus DRAM Memory 主記憶 AGP-Bus Graphic Processor audio PCI-Bus USB HDD IDE LAN
9
プロセッサの基本動作 CPU プログラム格納型 (フォン・ノイマン型) 主記憶にプログラム(機械命令、データ)を置いておく
入力装置 制御装置 主記憶にプログラム(機械命令、データ)を置いておく fetch CPUが機械命令を主記憶からfetchし解釈・実行 記憶装置 (主記憶) load 演算の入力データは主記憶から loadし、結果は主記憶に store store 演算装置 出力装置 :制御の流れ :データの流れ
10
プログラムと機械命令 アセンブリ言語 assembler 機械命令(機械語) compiler 高水準プログラミング言語(C言語)
swap: muli $2, $5, 4 add $2, $4,$2 lw $15, 0($2) lw $16, 4($2) sw $16, 0($2) sw $15, 4($2) jr $31 アセンブリ言語 swap (int v[ ], int k) { int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } assembler …. …. …. …. …. …. …. compiler 機械命令(機械語)
11
機械命令(machine instruction)
機械命令(機械語) …. opcode (OP) operand-1 operand-n ● opcode/OP : Operation Code (操作コード、オペコード、命令コード) データ読み書き・移動: load, store, move 算術演算: add, sub, multiply, divide 論理演算: and, or, xor, logical shift, arithmetic shift , … 分岐: branch, branch if not equal, branch if less than, … operand : 操作(演算)対象 memory (主記憶の内容) immediate (即値=機械語の一部をそのままデータとする) register (レジスタ)
12
memory immediate register
OP operand-1 operand-n ● CPU 制御装置 命令 デコード PR IR 主記憶 機械語 演算装置 MDR レジスタ ファイル ALU IR: Instruction Register PR: Program Register MDR: Memory Data Register ALU: Arithmetic & Logical Unit
13
プロセッサと機械語 計算機の内部表現
14
データの計算機内部表現 ビット(bit), バイト(byte)=8bit ワード/語 (word)= 32bit (多くの場合)
1 ワード/語 (word)= 32bit (多くの場合) ハーフワード/半語 (half word)= 16bit ダブルワード/倍長語 (double word)= 64bit
15
データの計算機内部表現 これは何と読める? 解釈4: OPコード “64”16 = add命令
opcode (OP) operand-1 operand-n ● 解釈4: OPコード “64”16 = add命令 1 解釈1: = 6410+3210+410 = 10010 解釈2: ×10+01002 = 6010+410 = 6410 解釈3: ASCIIコード “64”16 = 文字 “d” 所詮、約束事 ⇒ 代表的なものは覚える ⇒ 自分達で決める場合もある
16
データの計算機内部表現 0, 1の2値 10進数 文字 浮動小数点数 整数(固定小数点数) 0000~1001
ASCII 7ビットコード JIS 16ビットコード 整数(固定小数点数) 符号なし 符号付き: 2の補数表現 10進数 0000~1001 (BCD:Binary Coded Decimal) 浮動小数点数 仮数×基底指数 単精度: 32ビット 倍精度: 64ビット 拡張倍精度: 128ビット
17
データの計算機内部表現 ASCIIコード “b” “i” “t” という文字列はASCIIコードで 01100010 01101001
b6~b4 b3~b0 000 001 010 011 100 101 110 111 0000 NUL DLE SP @ P ′ p 0001 SOH DC1 ! 1 A Q a q 0010 STX DC2 " 2 B R b r 0011 ETX DC3 # 3 C S c s 0100 EOT DC4 $ 4 D T d t 0101 ENQ NAC % 5 E U e u 0110 ACK SYN & 6 F V f v 0111 BEL ETB ' 7 G W g w 1000 BS CAN ( 8 H X h x 1001 HT EM ) 9 I Y i y 1010 LF/NL SUB * : J Z j z 1011 VT ESC + ; K [ k { 1100 FF FS , < L \ l | 1101 CR GS - = M ] m } 1110 SO RS . > N ^ n ~ 1111 SI US / ? O _ o DEL “b” “i” “t” という文字列はASCIIコードで と表す
18
2進数表現と16進数表現 (binary) (hexa-decimal)
10進数 1 2 3 4 5 6 7 2進数 0000 0001 0010 0011 0100 0101 0110 0111 16進数 1 2 3 4 5 6 7 10進数 8 9 10 11 12 13 14 15 2進数 1000 1001 1010 1011 1100 1101 1110 1111 16進数 A B C D E F
19
2進数表現と16進数表現(例) 表記法 10進数 100 = 64 + 32 + 4 2進数 1000000 + 100000 + 100
2進数 + 100 = 16進数 = 64 表記法 10進数: 100, 10010 2進数: , b‘ ’, B 16進数: #64, #‘64’, 6416 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
20
教科書 p.5 へ 1.1 2進法 p.6 問題1.1, 1.2 をやって見よう 10進数 50 = 32 + 16 + 2 2進数
1.1 2進法 p.6 問題1.1, 1.2 をやって見よう 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
21
教科書 p.6 へ 1.2 16進法 p.7 問題1.3,1.4,1.5 をやって見よう! 1.3 2進法の加減算 p.7
進法 p.7 問題1.3,1.4,1.5 をやって見よう! 1.3 2進法の加減算 p.7 問題1.6,1.7 をやって見よう! 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
22
教科書 p.6 へ 進法 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
23
2進数表現と16進数表現(例) 表記法 10進数 100 = 64 + 32 + 4 2進数 1000000 + 100000 + 100
2進数 + 100 = 16進数 = 64 表記法 10進数: 100, 10010 2進数: , b‘ ’, B 16進数: #64, #‘64’, 6416 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
24
演習: 2進数表現と16進数表現を求めよ 10進数 200 = 2進数 = 16進数 = 解答: 128 + 64 + 8 10000000
2進数 = 16進数 = 解答: 128 + 64 + 8 + 1000 C8 別解: 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8 200 = 100×2 = ×2 = = C8
25
宿題: 2進数表現と16進数表現を求めよ 授業HP 「第1回宿題」のPDFを各自印刷し,次回授業の冒頭に副手に提出すること 10進数 50
= 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
26
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第2回) 中島 克人
27
プロセッサと機械語 計算機の内部表現
28
2進法の加減算 ・ ・ 2進数1桁の加算 02 + 02 = 02 02 + 12 = 12 12 + 02 = 12
(教科書 進法の加減算 p.7 ) 2進数1桁の加算 02 + 02 = 02 02 + 12 = 12 12 + 02 = 12 12 + 12 = 102 2進数1桁の減算 02 - 02 = 02 02 - 12 = 112 12 - 02 = 12 12 - 12 = 02 ・ 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8 ・ 1 :借り(borrow)
29
2進法の加減算 問題1.6 をやって見よう! 問題1.7 をやって見よう! 1010102-100112 = A7B16-28D16 =
(教科書 p.7 ) 問題1.6 をやって見よう! - = 問題1.7 をやって見よう! A7B16-28D16 = 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
30
負数の表現 補数表示 桁数を限定し, マイナス符号を付けずに表現 10進数3桁の例: (教科書 1.4 負数の表現 p.7 ) 補数表現
通常の表記 499 … 1 499 … 1 -1 -499 -500 999 … 501 500 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
31
負数の表現法:符号と絶対値表現 減算例:0012-1102=-1012 1 1 1
内部表現(4ビット) 負数を符号と絶対値で表現 1 1 1 符号 絶対値 減算方法: 00012-01102=(左右の大小比較後,左右を入れ替えて) -(1102-001)2 =-1012 = 11012 上記の左右の大小比較や入れ替え無しにそのまま演算したい 10進数 2進数 +2,147,483, +2,147,483, : : -2,147,483, -2,147,483, -2,147,483, 内部表現に 2の補数表現 を用いる
32
負数の表現法:2の補数表現 限られた桁数(ビット数)で正負両方の数を表現する 4ビットの例: 7 0111 6 0110 : ::::
10進数 2進数 7 0111 6 0110 : :::: 1 0001 0 0000 -1 -2 1110 -7 1001 -8 1000 10進数 2進数 +2,147,483, +2,147,483, : : -2,147,483, -2,147,483, -2,147,483, 最上位ビットは符号を表すが,下位ビットにはどういう規則性か?
33
負数の表現法:2の補数表現 2の補数表現は下記のように作られる 10進数 2進数 7 0111 1の補数を作る (ビット反転) 1000 1100 1110 3 0011 1 0001 -1 1111 -3 1101 1を足す -7 1001 0 0000 -8 1000 10進数 2進数 +2,147,483, +2,147,483, : : -2,147,483, -2,147,483, -2,147,483,
34
演習: 次の8ビット2進数の2の補数を求めよ (1) 011001002 解答: -011001002 = 100110112 + 1
= (2) 解答: = = 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
35
演習: 2の補数表現 10進数7の2の補数を6ビットで表現せよ 7 000111 111000 10進数7の2の補数を8ビットで表現せよ
10進数 2進数 1の補数を作る (ビット反転) 111000 1を足す - 10進数7の2の補数を8ビットで表現せよ 10進数 2進数 1の補数を作る (ビット反転) 1を足す -
36
ゼロ拡張と符号拡張 ゼロ拡張:符号なし整数 符号拡張:符号付き整数 000の2の補数は? 100の2の補数は? 値 S 値
16 bits 1 15 bits 値 S 値 000000・・000000 値 SSSSSSS・・SSSSSS 値 16 bits 16 bits 17 bits 15 bits (ビット反転) 000の2の補数は? 100の2の補数は? 10進数 -10 の2の補数を 6ビットで表現せよ 10進数 -10 の2の補数を 8ビットで表現せよ 111 10進数 2進数 0 000 0 ??? -4 100 4 ??? 1を足す (ビット反転) 011 1を足す 1を足す 1を足す
37
演習: 次の8ビット2進数を12ビット表現にせよ (1) 011001002 0000011001002 解答: (2) 100111002
10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
38
2進数の補数表現 2進数1桁の加算 02 + 02 = 02 02 + 12 = 12 12 + 02 = 12 12 + 12 = 102 長所 加算の演算対象が正か負かを意識せずに,各桁で下記の1桁加算ルールを適用すれば正しい結果が得られる. 従って,減算A-Bは,加算A+(Bの2の補数)に置き換えることができる. → 計算機は加算機能だけあれば良いことになる.
39
2進数の加算(8ビット整数の例) 2進数の減算 負数を加算 正数+正数 正数+負数 00100010 + 00010111 00111001
34 23 57 23 -34 -11 2進数の減算 負数を加算 正数+負数
40
演習:次の加減算を8ビットの2進数で! 正数+負数 00101010 42 + 11110001 -15 00011011 27 正数-負数
42 +(-15) 42 -15 正数-負数 53 -(-22) 53 22
41
例外:対応する正数はない(overflow)
2の補数表現(特殊な値) 0000の2の補数は? 1000の2の補数は? 10進数 2進数 0 0000 0 ???? (ビット反転) 1111 1を足す (ビット反転) 0111 1を足す -8 1000 8 ???? 例外:対応する正数はない(overflow)
42
2進数の加減算 4ビット整数の表現範囲(符号なし整数) ... 0~15 15 =24-1
15 =24-1 4ビット整数の表現範囲(正負整数) ... -8~0~7 10進数 2進数 - -2 1110 : :::: -7 1001 -8 1000 10進数 2進数 6 0110 : :::: 1 0001 0 0000 7 -8 -23= =23-1
43
2進数の加減算 4ビット整数(正負整数)での加減算 7 =23-1 a+b>7 となるような演算をしたら,結果は4ビットで
10進数 2進数 6 0110 : :::: 1 0001 0 0000 - -2 1110 : :::: -7 1001 -8 1000 4ビット整数(正負整数)での加減算 7 -8 -23= =23-1 overflow overflow a+b>7 となるような演算をしたら,結果は4ビットで 正しく表現できない! ... overflow と称する (オーバーフロー) -a-b<-8 となるような演算をしたら,結果は4ビット で正しく表現できない! ... overflow と称する
44
2進数の加減算 -2N-1 2N-1-1 Nビット整数の表現範囲 -2N-1~0~2N-1-1 N ビット での表現可能範囲
2N-1-1 overflow overflow (負の) (正の) N ビット での表現可能範囲
45
2進数の加減算(overflow) 演習:次の4ビット演算の結果は overflow か? (1) 01102 +01012 答: yes
+ 0101 1011 答: yes (2) -01012 =01102 +10112 0110 + 1011 0001 答: no (3) -01102 -01012 =10102 +10112 1010 + 1011 0101 答: yes 演算結果だけでは判断つかない → 演算中に判断できる!
46
宿題: 2進数の負数表現,および,加減算を行え
授業HP 「第2回宿題」のPDFを各自印刷し,次回授業の冒頭に副手に提出すること 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
47
教科書 p.9 へ 問題1.8,1.9 をやって見よう! 問題1.8 解答: -3456 の,16ビットの 2の補数表示 を求めよ
3456 の 2進数表現は であった. 16ビットに符号拡張すると, これの 2の補数表示 は 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
48
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第3回) 中島 克人
49
2進数の加減算(overflow) = (正の)overflow (負の)overflow 4210 + (-1510) は?
取っておきの 見分け方!! (8ビットの場合) (正の)overflow #‘7F’ + #‘1’ (負の)overflow - #‘2’ - #‘7F’ 符号ビットへの桁上げ:有 符号ビットからの桁上げ:無 = 符号ビットへの桁上げ:無 符号ビットからの桁上げ:有 (-1510) は?
50
2進数の加減算(overflow) 正数+負数 00101010 + 11110001 42 -15 00011011 27 正数-負数
(8ビットの場合) 正数+負数 42 +(-15) overflowなし 42 -15 符号ビットへの桁上げ:有 符号ビットからの桁上げ:有 正数-負数 53 -(-22) overflowなし 53 22 符号ビットへの桁上げ:無 符号ビットからの桁上げ:無
51
教科書 p.9 へ 問題1.9 をやって見よう! 問題1.9 16ビットの符号付き数の最大値,最小値を, 2進,16進,および,10進で示せ
また,符号なし数についても同じようにせよ 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
52
問題1.9 問題1.9 16ビットの符号付き数と符号なし数の最大値,最小値を2進,16進,および,10進で示せ
(教科書 p.9) その前にまず, 8ビットの符号なし数の最大値,最小値を2進,16進,および,10進で示せ 2進: ~ , 16進: #00 ~ #FF 10進: 0 ~ 28-1 → 0 ~ 255 次に,8ビットの符号付き数の最大値,最小値を2進,16進,および,10進で示せ 2進: ~ , 16進: #80 ~ #7F 10進: -27 ~ 27-1 → -128 ~ 127 問題1.9 16ビットの符号付き数と符号なし数の最大値,最小値を2進,16進,および,10進で示せ 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
53
プロセッサと機械語 計算機の構成
54
2章 計算機のしくみ(COMET Ⅱ を題材に)
(教科書 p.10) CPU 入力装置 主記憶 プログラムを格納 (実行結果も格納) 制御装置 記憶装置 (主記憶) fetch load プログラム =手続き(処理主体) +データ(処理対象) 演算装置 store 出力装置 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8 :制御の流れ :データの流れ
55
語とビット COMET Ⅱ では主記憶上の1語は 16 ビット 1語 ビット位置 15 14 13 12 11 10 9 8 7 6 5 4
ビット位置 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
56
記憶装置と番地(アドレス) 主記憶 COMET Ⅱ では 1語の番地を 16 ビット表現
n : 3 2 1 語 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8 COMET Ⅱ では 1語の番地を 16 ビット表現 = 0 ~ 216-1 = 0 ~ = 0 ~ 約64K
57
記憶装置と番地(アドレス) COMET Ⅱ では 2語長の機械命令と1語長の機械命令がある 主記憶 命令A 2語(長)命令 命令B 命令C
n : 3 2 1 命令A 2語(長)命令 命令B 命令C 1語(長)命令 データ1 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
58
CPU = 制御装置 + 演算装置 CPU ALU IR: Instruction Register
命令 デコード PR IR 主記憶 機械 命令 演算装置 MDR レジスタ ファイル ALU IR: Instruction Register PR: Program Register MDR: Memory Data Register ALU: Arithmetic & Logical Unit
59
2章 計算機のしくみ(COMET Ⅱ を題材に)
(教科書 p.11) 制御装置 機械命令(命令)の主記憶からの取り出し(fetch) PR(Program Register, PC: Program Counter) が主記憶上の命令アドレスを保持 取り出した命令の解釈(デコード) 取り出した命令は IR(Instruction Regiter)に保持 必要なデータを渡して演算装置を制御 演算装置 四則演算のような計算を行う 演算は ALU(Arithmetic and Logical Unit)で行う (COMET Ⅱには無いが)乗除算は乗算器・除算器で行う GR(General Register,汎用レジスタ)に演算途中結果を保持 COMET Ⅱには レジスタファイルに8個の GR(GR0~GR7)が備わる SF, ZF, OF からなる FR(Flag Register)に結果の正負等を格納 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
60
2章 計算機のしくみ(COMET Ⅱ を題材に)
入力装置と出力装置 制御装置と複雑なやり取りを行う データは主記憶を介してやり取りする COMET Ⅱ では入出力はマクロ命令で行う マクロ命令とは複数の命令列に名前を付けたもの COMET Ⅱのマクロ命令の内容詳細は定義されていない 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
61
機械命令の実行イメージ CPU ①命令の取出し(命令フェッチ) ②命令デコードとオペランド取出し (命令デコード) ① ②
命令制御 ②命令デコードとオペランド取出し (命令デコード) ② 命令 デコード PR IR 主記憶 ① ③命令実行 (演算) 機械語 ④主記憶の読み書き (メモリアクセス) 演算ユニット ④ ⑤ MDR ALU ALU または、 ⑤レジスタへの書き戻し (レジスタ格納) レジスタ ファイル ③ PR: Program Register, IR: Instruction Register MDR: Memory Data Register, ALU: Arithmetic & Logical Unit
62
機械命令の実行イメージ CPU ロード(load)命令 ① ② ④ ⑤ ③ 例:LD GR1,100,GR2 ①命令の取出し 100
2語(長)命令 ロード(load)命令 主記憶上の指定された番地(実効アドレス)の内容を読み出し,指定されたレジスタに格納する CPU 命令制御 演算ユニット MDR PR IR 命令 デコード レジスタ ファイル MAR ALU 例:LD GR1,100,GR2 ② 主記憶 ① 100 ①命令の取出し 機械語 ②命令デコードとGR2の 読み出し ④ ⑤ GR1 GR2 ③100+(GR2) (演算=実効アドレス計算) ③ ④主記憶読出し ⑤GR1に格納 (レジスタ格納)
63
機械命令の実行イメージ CPU ロードアドレス(load address)命令 ① ② ⑤ ③ 例:LAD GR1,100,GR2 100
2語(長)命令 ロードアドレス(load address)命令 指定された番地(実効アドレス)自身を,指定されたレジスタに格納する 指定された数字をレジスタに格納するためにも用いられる CPU 命令制御 演算ユニット MDR PR IR 命令 デコード レジスタ ファイル MAR ALU ② 例:LAD GR1,100,GR2 主記憶 ① 100 ①命令の取出し 機械語 ②命令デコードとGR2の 読み出し GR2 ③100+(GR2) (演算=実効アドレス計算) ⑤ GR1 ③ ④ (メモリアクセスは無し) ⑤GR1に格納 (レジスタ格納)
64
機械命令の実行イメージ CPU 算術加算(add arithmetic)命令 ② ① ⑤ ③ 例:ADDA GR1,GR2 ①命令の取出し
1語(長)命令 算術加算(add arithmetic)命令 指定された2つのレジスタの内容を算術加算し,左側に指定されたレジスタに格納する CPU 命令制御 演算ユニット MDR PR IR 命令 デコード レジスタ ファイル MAR ALU 主記憶 機械語 例:ADDA GR1,GR2 ② ① ①命令の取出し ②命令デコードとGR1,GR2の読み出し GR2 GR1 ③(GR1)+(GR2) (演算) ④ (メモリアクセスは無し) ⑤ GR1 ③ ⑤GR1に格納
65
プログラム実行イメージ CPU 機械命令 =手続き 主記憶 番地 データ 1 6番地のデータ を GR1 に 2 数値 1 を GR2 に
制御装置 番地 主記憶 命令 デコード 7 6 5 4 3 2 1 n : 8 PR IR 6番地のデータ を GR1 に 数値 を GR2 に 6+GR2番地のデータ をGR3に 演算装置 GR1+GR3 を GR1 に GR1 を 8番地 に格納 MDR レジスタ ファイル データ データ ALU データ 格納場所 GR0~GR7
66
プロセッサと機械語 機械命令 とその オペランド
67
機械命令(machine instruction)
機械命令(命令)/機械語 の一般形 opcode (OP) operand-1 operand-n ● opcode/OP : Operation Code (操作コード、オペコード、命令コード) データ読み書き・移動: load(lw), store(sw), move(mv) 算術演算: add, sub, multiply(mul), divide(div) 論理演算: and, or, xor, logical shift, arithmetic shift , … 分岐: branch, branch if not equal, branch if less than, … operand : 操作(演算)対象 register (レジスタ) memory (メモリ) immediate (即値)
68
プログラム実行イメージ CPU register (レジスタ) memory (メモリ) immediate (即値) 主記憶 番地 1
制御装置 番地 主記憶 命令 デコード 7 6 5 4 3 2 1 n : 8 PR IR 6番地のデータ を GR1 に 数値 を GR2 に (A+GR2)番地のデータ をGR3に GR1+GR3 を GR1 に GR1 を 8番地 に格納 演算装置 MDR レジスタ ファイル データ ALU データ 格納場所
69
機械命令イメージ immediate (即値) register (レジスタ) memory (メモリ) 番地 主記憶 GR1 6番地
Load 7 6 5 4 3 2 1 n : 8 6番地のデータ を GR1 に 数値 を GR2 に (A+GR2)番地のデータ をGR3に GR1+GR3 を GR1 に GR1 を 8番地 に格納 GR2 1 Load address GR3 6番地 Load GR2 GR1 Add GR3 GR1 8番地 Store データ index register データ 格納場所
70
memory immediate register
OP operand-1 operand-n ● CPU 制御装置 命令 デコード PR IR 主記憶 機械語 演算装置 MDR レジスタ ファイル ALU IR: Instruction Register PR: Program Register MDR: Memory Data Register ALU: Arithmetic & Logical Unit
71
機械命令の例 (COMET Ⅱの場合) 1語(1語長)命令 2語(2語長)命令 ADDA GR1,GR3 op gr1 gr2
LD GR5,GR3 ADDA GR1,GR3 アセンブラでの表記 op gr1 gr2 8 bit bit 4 bit #: 16進数表記 2語(2語長)命令 LD GR1,#7 LAD GR2,#64 LD GR1,Lab op gr adr xr インデックス レジスタ指定 ,GR2 8 bit bit 4 bit bit アルファベット: ラベル表記 gr,gr1,gr2 : 汎用レジスタ ... GR0 ~ GR7 adr: 番地,数字,リテラル ... ラベル,10進数,16進数,他 op : 命令の種類 ... LD,ADDA 等 xr: インデックスレジスタ ... GR1 ~ GR7 (GR0は指定できない)
72
機械命令の例 (COMET Ⅱの場合) インデックスレジスタ(xr)の省略
2語長命令におけるアセンブラでの表記において, インデックスレジスタを省略したとき,機械語では xr 部には 00002が埋められるため,CPUはインデックスレジスタの読み出し操作をしないと判断できる (=インデックスレジスタに GR0 が使用できない理由となる) アセンブラでの表記 機械語 LAD GR2 ,#1FA,GR4 LAD 0010 #1FA 0100 8 bit bit 4 bit bit インデックスレジスタ有り LAD GR2,#1FA LAD 0010 #1FA 0000 8 bit bit 4 bit bit インデックスレジスタの省略 (インデックスレジスタ不使用)
73
機械命令の例 (一般形) register-register命令 register-immediate命令
R: Register number, I: Immediate (即値) D: Displacement (変位=相対アドレス) ADDA GR5,GR3 LD GR1,GR2 アセンブラでの表記 register-register命令 OP R OP R I LAD GR3,#5110 register-immediate命令 LD GR4,LAB,GR6 OP R1 D R2 register-register-displacement命令
74
機械命令(機械語)とアセンブラ COMET Ⅱの2語(2語長)命令 COMET Ⅱの機械語の具体例
(教科書 p.13) COMET Ⅱの2語(2語長)命令 op gr adr xr 8 bit bit 4 bit bit COMET Ⅱの機械語の具体例 ビット列でのプログラムを「機械語プログラミング」と称する 0101 0000 アセンブリ言語CASL Ⅱでの表記例(その1) LD GR5,102 ... ロード:102(10進数)番地の内容をGR5に CASL Ⅱのアセンブラ・ニーモニック(assembler mnemonic) 自分専用アセンブラとして独自のニーモニックを定めても良い
75
プログラムと機械命令 CASL Ⅱ アセンブリ言語 機械命令(機械語) compiler 高水準プログラミング言語(C言語)
SWAP SLA GR2, 1 ADDA GR2,0,GR2 LD GR5, 0, GR2 LD GR6, 4 ST GR6, 0, GR2 ST GR5, 4, GR2 RET CASL Ⅱ 高水準プログラミング言語(C言語) swap: muli $2, $5, 4 add $2, $4,$2 lw $15, 0($2) lw $16, 4($2) sw $16, 0($2) sw $15, 4($2) jr $31 アセンブリ言語 swap (int v[ ], int k) { int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } assembler A …. …. …. …. …. …. …. compiler 機械命令(機械語)
76
機械命令イメージ(正確版) A番地 主記憶 番地 1 A番地 C番地 register (レジスタ) immediate (即値)
memory (メモリ) Load GR1 A番地 番地 主記憶 Load address GR2 1 1,2 A番地のデータ を GR1 に 数値 を GR2 に (A+GR2)番地のデータ をGR3に GR1 +GR3 を GR1 に GR1 を C番地 に格納 Load GR3 GR2 A番地 3,4 5,6 index register Add GR1 GR3 7 8,9 Store GR1 C番地 A データ データ B データ C 格納場所 データ : ???
77
COMET Ⅱマシンの機械命令(例) アセンブリ言語CASL Ⅱでの表記例(その3) LD GR1,SA LAD GR2,1
ラベル参照 主記憶 番地 B A 8,9 7 5,6 3,4 1,2 : C A番地のデータ を GR1 に 数値 を GR2 に (A+GR2)番地のデータ をGR3に GR1 +GR3 を GR1 に GR1 を C番地 に格納 格納場所 データ(#10) データ(#20) GR1 A番地 Load GR2 1 address Add GR3 C番地 Store データ ??? LD GR1,SA LAD GR2,1 LD GR3,SA,GR2 ADDA GR1,GR3 ST GR1,RC SA DC #10 DC #20 定数 RC DS 1 定数定義 ラベル(label) ラベル(label) 語数 場所確保
78
宿題: WCASL-IIのインストールとサンプルプログラム実行
次回までに前記の要領でWCASL-IIを自PCにインストール 授業HPの「参考→CASL-II演習プログラム集→SMPL.cas」をダウンロード WCASL-II にて下記の手順にて SMPL.cas をアセンブルし,実行する 1a. 「ファイル」→「CASL2プログラムの新規作成」とし, SMPL.cas の内容を貼り付ける. 1b. もしくは,「ファイル」→「CASL2ファイルを開く」 2. 「プロジェクト」→「アセンブル」によりアセンブラの実行 3. 「プロジェクト」→「CASLシミュレート」でシミュレータを開く 4. <enter>キーを1回ずつ入力し,画面内の情報変化を観察 5.( 「プロジェクト」→「リロード」でシミュレーションをやり直す事が可能) 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
79
機械命令の例(加算命令) IRからの操作指定(ADDA GR5, 16) IR ADDA GR5 - 16 FR ALU O Z S
制御装置 IR ADDA GR5 - 16 操作 コード 演算装置 R-Bus L-Bus L R L-Adr. GR0~7 R-Adr. FR ALU W-Adr. O Z S W W-Bus
80
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第4回) 中島 克人
81
COMET Ⅱマシンの機械命令(例) ( CASL Ⅱ表記 ) gr : GR0~GR7 xr : GR1~GR7 [ ] : 省略可
LD gr,adr[,xr] ST gr,adr[,xr] ADDA gr1,gr2 CPL gr,adr[,xr] SLA gr,adr[,xr] JPL adr[,xr] PUSH adr[,xr] POP gr CALL adr[,xr] RET etc. LoaD STore ADD Arithmetic ComPare Logical Shift Left Arithmetic Jump on PLus PUSH effective address POP up CALL subroutine RETurn from subroutine 授業HPに一覧表有り
82
... ロード:LAB+GR1の内容を番地として,
COMET Ⅱマシンの機械命令(例) アセンブリ言語CASL Ⅱでの表記例(その2) LD GR5,LAB ... ロード:LAB番地の内容をGR5にコピー LD GR5,LAB,GR1 ... ロード:LAB+GR1の内容を番地として, その内容をGR5にコピー LAD GR5,12 ... ロードアドレス:12(10進数)をGR5に格納 ADDA GR5,GR1 ... 算術加算:GR5の内容+ GR1の内容 をGR5に格納
83
COMET Ⅱマシンの機械命令(例) LD GR5,LAB ... ロード:LAB番地の内容をGR5にコピー
adr = LAB 主記憶 LAB GR0~7 GR5 コピー ● EA:Effective Address LD GR5,LAB,GR ロード:LAB+(GR1の内容)を番地(実効番地 EA(Effective Address))として,その内容をGR5にコピー ● 主記憶 LAB +6 GR0~7 GR1 6 LD 5 adr = LAB 1 + GR5 コピー ● EA:Effective Address
84
COMET Ⅱマシンの機械命令(例) LAD GR5,12 ... ロードアドレス:12(10進数)をGR5に格納
8 LAD 5 adr = 12 / 12 ADDA GR5,GR 算術加算:GR5の内容+ GR1の内容をGR5に格納 GR0~7 GR5 8 GR1 6 ● ADDA 5 1 + / 14 ●
85
オペランドの指定法(まとめ 1/2) Immediate ... LAD GR5,12 etc. Direct addressing
op gr I I:Immediate (即値) op gr adr ● 主記憶 Direct addressing ... LD GR5,LAB etc. op gr adr ● アドレス ● 主記憶 Indirect addressing ... (COMET Ⅱには無い)
86
(Effective Address :実効番地)
オペランドの指定法(まとめ 2/2) Absolute address(絶対アドレス) op gr adr EA (Effective Address :実効番地) ... LD GR5,LAB etc. op gr xr register ● EA + xr: Index register Index register による修飾 adr ... LD GR5,LAB,GR1 etc.
87
プロセッサと機械語 COMETⅡ と CASLⅡ
88
CASL-Ⅱ シミュレータ(WCASL-Ⅱ)
講義HPから wcs2108.zip を適当なフォルダにダウンロード C:/FreeSoft/WCASL/wcs2108.zip など wcs2108.zip を解凍 解凍ソフトがない場合は,圧縮・解凍ソフトをダウンロード (講義HP経由では Lhaplus) SETUP.exe を実行し,適当なフォルダにインストール C:/FreeSoft/WCASL/ などに 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
89
COMET Ⅱマシンの構成 汎用レジスタ(16ビット×8個) フラグレジスタFR(3ビット) プログラムレジスタPR(16ビット)
GR0,GR1,GR2,GR3,GR4,GR5,GR6,GR7 ... gr,gr1,gr2として使用可能 ... GR0以外はインデックスレジスタ(xr)としても使用可能 フラグレジスタFR(3ビット) SF ... 演算やロード結果が負であることを表す ZF ... 演算やロード結果が零であることを表す OF ... 演算結果のオーバフローを表す プログラムレジスタPR(16ビット) 次に実行すべき命令の番地を保持している スタックポインタSP(16ビット) スタックの先頭番地を保持している スタック操作を含む PUSH, POP, CALL, RET により値が変更される
90
WCASL-Ⅱ (COMETシミュレータ)
IR: Instruction Register (命令レジスタ) PR: Program Register (PC: Program Counterとも) SP: Stack Pointer MAR: Memory Address Register MDR: Memory Data Register 単なる説明 制御装置 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8 演算装置 主記憶
91
教科書 p.15 から COMET Ⅱの機械命令 CASL Ⅱのプログラミング例と WCASL Ⅱを用いた演習 10進数 50 = 32
+ 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
92
プロセッサと機械語 メモリ参照と演算
93
アセンブリ言語CASLⅡ プログラム例(SMPL) ; コメント行は 「;」よりも左から行末まで
; コメント行は 「;」よりも左から行末まで SMPL START ; ラベルは左端カラムから,STARTは必須 ; 命令(ラベル以外)は 2カラム目以降に LD GR0,DAT ; DAT 番地の内容を GR0 に ; 即ち,<DAT> → GR0 LAD GR1, ; 1 → GR1 ADDA GR0,GR ; <GR0>+<GR1> → GR0 ST GR0,ADR ; <GR0> → ADR1 RET ; このプログラムを起動したOSに制御を戻す(必須) DAT DC # ; 定数#0002 をここに配置 ADR1 DS ; 1語分の領域 をここに確保 END ; ENDは必須 ラベルは 左端から 書く プログラムの最初と最後を示す
94
COMET Ⅱマシンの機械命令 ロード(load)命令 gr : GR0~GR7 xr : GR1~GR7 [ ] : 省略可
(教科書 p.15) ロード(load)命令 [書き方] LD gr,adr[,xr] [機能] <e> → GRn; 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] LD GR1,1000 gr : GR0~GR7 xr : GR1~GR7 [ ] : 省略可 e : 実効番地(EA) <α> : αの内容 →:値の代入(コピー)
95
COMET Ⅱマシンの機械命令 ロード(load)命令 [書き方] LD gr1,gr2 [機能] <GRn2> → GRn1;
(教科書 p.16) ロード(load)命令 [書き方] LD gr1,gr2 [機能] <GRn2> → GRn1; 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] LD GR1,GR2
96
COMET Ⅱマシンの機械命令 ストア(store)命令 [書き方] ST gr,adr[,xr] [機能] <GRn>→e
[実行例] ST GR1,COUNT
97
COMET Ⅱマシンの機械命令 ロードアドレス(load address)命令 (教科書 p.17)
[書き方] LAD gr,adr[,xr] [機能] e → GRn [実行例] LAD GR3,COUNT
98
WCASL Ⅱで予想を確かめて見よう 右図のような時,以下の命令を実行後の GR0 の内容は? 問題1: LAD GR0,#0025
予想解答: ? GR0 主記憶 #0200 DAT(= #0025) #0300 #0400 #0026 #0027 問題2: LAD GR0,DAT 予想解答: #0001 GR1 問題3: LAD GR0,DAT,GR1 予想解答: 問題4: LD GR0,DAT 予想解答: 問題5: LD GR0,DAT,GR1 予想解答: 問題6: LD GR0,#0024,GR1 予想解答:
99
アセンブリ言語CASLⅡ テスト用プログラム例(TEST) TEST START ; STARTは必須 ;
LAD GR1, ; 1 → GR1 LD GR0,# ; テスト対象の命令 ;; RET ; このプログラムを起動したOSに制御を戻す(必須) DAT DC #0200,#0300,#0400 ; 定数#0002,#0300,#0400 をDAT番地から3語分に配置 END ; ENDは必須
100
WCASL Ⅱで予想を確かめて見よう 右図のような時,以下の命令を実行後の GR0 の内容は? 問題1: LAD GR0,#0025
予想解答: 解答: #0025 ? GR0 主記憶 #0200 DAT(= #0025) #0300 #0400 #0026 #0027 問題2: LAD GR0,DAT 予想解答: #0001 GR1 解答: #0025 問題3: LAD GR0,DAT,GR1 予想解答: 解答: #0026 問題4: LD GR0,DAT 予想解答: 解答: #0200 問題5: LD GR0,DAT,GR1 予想解答: 解答: #0300 問題6: LD GR0,#0024,GR1 予想解答: 解答: #0300
101
アセンブリ言語CASLⅡ テスト用プログラム例(TEST) TEST START ; STARTは必須 ;
LAD GR1, ; 1 → GR1 LD GR0,# ; テスト対象の命令 ST GR0,RSLT RET ; このプログラムを起動したOSに制御を戻す(必須) DAT DC #0200,#0300,#0400 ; 定数#0002,#0300,#0400 をDAT番地から3語分に配置 RSLT DS ; 結果格納用に1語確保 END ; ENDは必須
102
プロセッサと機械語 算術演算と オーバフロー
103
COMET Ⅱマシンの機械命令 算術加算(add arithmetic)命令 (1語命令) (教科書 p.17)
[書き方] ADDA gr,adr[,xr] [機能] <GRn> + <e> → T; <T> → GRn; if (<T> > =215-1 or <T> < -32768 ) then 1→OF else 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] ADDA GR0,COUNT (1語命令) [書き方] ADDA gr1,gr2 [機能] 上記と同様
104
COMET Ⅱマシンの機械命令 (教科書 p.18) 算術加算(add arithmetic)命令 [実行例] ADDA GR0,COUNT
105
宿題: LD,LAD,ADDA,ST命令等を含むプログラムの実行結果を求めよ (それぞれ結果予想を行った上で, WCASL IIで実行し,確かめよ)
授業HP 「第4回宿題」のPDFを各自印刷し,次回授業の冒頭に副手に提出すること 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
106
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第5回) 中島 克人
107
アセンブリ言語CASLⅡ プログラム例(SMPL2) CASLシミュレータで実行する前に,結果を予想して見よう! SMPL2 START
LAD GR0,# ; #0001 → GR0 LAD GR1, ; 1 → GR1 LD GR2,DAT ; DAT 番地の内容を GR2 に ; 即ち,<DAT> → GR2 LD GR3,DAT,GR ; <e>(=<DAT+<GR1>>) → GR3 ADDA GR2,GR ; <GR2>+<GR3> → GR2 ST GR2,ADR ; <GR2> → ADR1 RET DAT DC # ; 定数#0002 をここに配置 DC # ; 定数#0003 をここに配置 ADR1 DS ; 1語分の領域 をここに確保 END CASLシミュレータで実行する前に,結果を予想して見よう!
108
COMET Ⅱマシンの機械命令 論理加算(add logical)命令 (1語命令) (教科書 p.18)
[書き方] ADDL gr,adr[,xr] [機能] <GRn> + <e> → T; <T> → GRn; if <T> > 65535=216-1 then 1→OF else 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] ADDL GR0,COUNT (1語命令) [書き方] ADDL gr1,gr2 [機能] 上記と同様
109
COMET Ⅱマシンの機械命令 算術加算ADDAと論理加算ADDLの違い 符号ビットへの桁上げ:有 符号ビットからの桁上げ:無
(教科書 p.18) 算術加算ADDAと論理加算ADDLの違い 演算結果(16ビットのビットパターン)は同じ (ただし,最上位ビットが1の場合,前者は負の数字,後者は正の数字を表している) オーバフローの解釈が異なる 別の解釈: 正の数同士の加算で結果が負になったので異常 = overflow ADDA) (例) 符号ビットへの桁上げ:有 符号ビットからの桁上げ:無 故にoverflow ADDL) 別の解釈: 2つの正の数よりも加算結果が大きいので正常 = overflow無し 最上位ビットからの桁上げ:無 故にoverflow無し
110
アセンブリ言語CASLⅡ プログラム例(SMPL3)
GR0 に#01C5 をロードした後,COUNT番地の #1F9A と算術加算し,結果の値とFRの値を確認せよ SMPL3 START LAD GR0,#01C ; #01C5 を GR0 に ADDA GR0,COUNT ; <GR0>+<COUNT> → GR0 RET COUNT DC #1F9A ; 定数#1F9A をここに配置 END 同様に,GR0 に#6C25 をロードした後,COUNT番地の #1EB7 と算術加算し,結果の値とFRの値を確認せよ 同様に,GR0 に#6C25 をロードした後,COUNT番地の #1EB7 と論理加算し,結果の値とFRの値を確認せよ
111
COMET Ⅱマシンの機械命令 算術減算(subtract arithmetic)命令 (1語命令) (教科書 p.19)
[書き方] SUBA gr,adr[,xr] [機能] <GRn> - <e> → T; <T> → GRn; if (<T> > =215-1 or <T> < -32768 ) then 1→OF else 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] SUBA GR2,COUNT もし,16ビット での2の補数 表現の範囲を 超えていると (1語命令) [書き方] SUBA gr1,gr2 [機能] 上記と同様
112
COMET Ⅱマシンの機械命令 論理減算(subtract logical)命令 (1語命令) (教科書 p.19)
[書き方] SUBL gr,adr[,xr] [機能] <GRn> - <e> → T; <T> → GRn; if <T> < 0 then 1→OF else 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] SUBL GR2,COUNT (1語命令) [書き方] SUBL gr1,gr2 [機能] 上記と同様
113
演習 下記を行う SMPL4 を作成し,実行して見よ
DAT番地のデータ #0001 と(DAT+1)番地のデータ #8000を算術加算し,(DAT+2)番地に格納せよ SMPL4 START LAD GR1, ; 1 → GR1 LD GR2,DAT ; <DAT> → GR2 LD GR3,DAT,GR ; <e>(=<DAT+<GR1>>) → GR3 ADDA GR2,GR ; <GR2>+<GR3> → GR2 LAD GR1, ; 2 → GR1 ST GR2,DAT,GR ; <GR2> → DAT+<GR1> RET DAT DC # ; 定数#0001 をここに配置 DC # ; 定数#8000 をここに配置 DS ; 1語分の領域 をここに確保 END 1命令で 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8 ADDA GR2,DAT,GR1 ; <GR2>+<DAT+<GR1>>→GR2
114
演習 SMPL4 の実行の結果,SF, ZF, OF はどうなったか? その理由も考察せよ
FR (フラグレジスタ) ヒント: SZ設定する命令は FR を3ビットまとめて上書きする 最後の SZ設定 が有効となる 解答: 最後に SZ設定 したのは ADDA命令で,結果は #8001 その時の結果は,SF=1,ZF=0,OF=0 算術加算の代りに算術減算とすると,SF, ZF, OF はどうなるか? 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8 解答: オーバフローするので,SF=1,ZF=0,OF=1
115
アセンブリ言語CASLⅡ 演習SUBL ... SUBL を使って,下記を計算するプログラムを作成し,WCASL Ⅱで実行せよ
論理減算にて,#80FF - 100 - #35F5 を実行し,答えを16進数で回答せよ そして,オーバフローしたかどうかを確かめよ 上記と同じ計算を算術減算SUBAにて行い,オーバフローも確かめよ SUBL START LAD GR1,#80FF LAD GR2,100 SUBL GR1,GR2 LAD GR2,#35F5 ST GR1,RSLT RET RSLT DS 1 END SUBA START LAD GR1,#80FF LAD GR2,100 SUBA GR1,GR2 LAD GR2,#35F5 ST GR1,RSLT RET RSLT DS 1 END
116
アセンブリ言語CASLⅡ ここまでに学んだ命令 機械語命令(Comet IIマシンが直接解釈し実行する命令): LD (Load)
LAD (Load Address) ST (Store) ADDA (Add Arithmetic) ADDL (Add Logical) SUBA (Subtract Arithmetic) SUBL (Subtract Logical) RET (Return) アセンブラ命令(アセンブラに指示するための命令(マシンは実行しない): START …アセンブルすべきプログラムの開始位置を示す DC (Define Constant) … 定数を主記憶上に配置する DS (Define Storage) … 主記憶上に空き領域を確保する END …アセンブルすべきプログラムの最後を示す
117
プロセッサと機械語 論理演算と比較
118
COMET Ⅱマシンの機械命令 論理演算(0と1からなる論理値同士の演算) 論理積(AND) ... X and Y
論理和(OR) X or Y 排他的論理和(xOR) X xor Y 否定(NOT) not X X = 02 Y = 12 X and Y = 02 1bit 演算例 and ) X Y X and Y X or Y X xor Y not X X = 0 12 Y = 1 12 X and Y = 0 12 2bit 演算例 and ) 各bit位置(桁)ごとに 表にある演算規則を 適用する bit反転 即ち,Y=1の時,結果はXの反対で,Y=0の時,結果はXと同じ
119
COMET Ⅱマシンの機械命令 論理積(and)命令 (1語命令) (教科書 p.19) [書き方] AND gr,adr[,xr]
[機能] <GRn> ∧ <e> → GRn; 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] AND GR3,COUNT and記号 16 bit のそれぞれの桁ごとに and 演算 (1語命令) [書き方] AND gr1,gr2 [機能] 上記と同様
120
COMET Ⅱマシンの機械命令 論理和(or)命令 (1語命令) (教科書 p.20) [書き方] OR gr,adr[,xr]
[機能] <GRn> ∨ <e> → GRn; 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] OR GR3,COUNT or記号 (1語命令) [書き方] OR gr1,gr2 [機能] 上記と同様
121
COMET Ⅱマシンの機械命令 + 排他的論理和(exclusive or)命令 (1語命令) (教科書 p.20)
[書き方] XOR gr,adr[,xr] [機能] <GRn> 〇 <e> → GRn; 0→OF; SZ設定 if <GRn>=0 then 1→ZF else 0→ZF <GRn[15]>→SF; [実行例] XOR GR3,COUNT + xor記号 E (1語命令) [書き方] XOR gr1,gr2 [機能] 上記と同様
122
下位4 bit だけを残し,他のbit を 0 にする マスク(mask)
論理演算の使用例 下位4 bit だけを残し,他のbit を 0 にする マスク(mask) AND命令 and) and) 上位4 bit だけを残し,他のbit を 1 にする マスク(mask) OR命令 or) or) XOR命令 xor) 下位4 bit だけ各bit の値を反転する マスク(mask)
123
アセンブリ言語CASLⅡ + 演習 XOR ... #00FF 〇 #0F0F を計算するプログラムを完成させて実行し,結果を確認せよ
XOR START LAD GR0,#00FF XOR GR0,DAT ST GR0,RSLT RET DAT DC #0F0F RSLT DS 1 END 排他的論理和に代えて,論理積,即ち #00FF ∧ #0F0F とすると結果がどうなるか確認せよ 排他的論理和は ビット反転 , 論理積は 不要部分を0にする マスク の機能がある.
124
アセンブリ言語CASLⅡ 演習 AOX ... (#00FF ∧ #0FF3) ∨ #F0FC) 〇 #FF00)を計算するプログラムを完成させて実行し,途中経過も含めて答えを求めよ + AOX START LAD GR0,#00FF LAD GR1, ; 1 → GR1 ... インデックシング用 AND GR0,DAT ; #00FF ∧ #0FF3 → GR0 ST GR0,RSLT ; <GR0> → RSLT OR GR0,DAT,GR1 ; GR0 ∨ #F0FC → GR0 ST GR0,RSLT,GR1 ; <GR0> → RSLT+1 ADDA GR1,GR ; 2 → GR1 ... インデックシング用 XOR GR0,DAT,GR1 ; GR0 xor #FF00 → GR0 ST GR0,RSLT,GR1 ; <GR0> → RSLT+2 RET DAT DC #0FF3,#F0FC,#FF00 RSLT DS 3 END
125
算術減算(SUBA)をしたふりをし,FRだけをセットする命令
COMET Ⅱマシンの機械命令 (教科書 p.21) 算術比較(compare arithmetic)命令 [書き方] CPA gr,adr[,xr] [機能] if <GRn> > <e> then {0→ZF; 0→SF} else if <GRn> = <e> then {1→ZF; 0→SF} else {0→ZF; 1→SF}; 0→OF} ただし,符号付き数同士の比較 [実行例] CPA GR0,COUNT 算術減算(SUBA)をしたふりをし,FRだけをセットする命令 [つまり] <GRn>-<e> = t とし, <t> > {0→ZF; 0→SF} <t> = {1→ZF; 0→SF} <t> < {0→ZF; 1→SF} そして,常に {0→OF} (1語命令) [書き方] CPA gr1,gr2 [機能] 上記と同様
126
論理減算(SUBL)をしたふりをし,FRだけをセットする命令
COMET Ⅱマシンの機械命令 (教科書 p.21) 論理比較(compare logical)命令 [書き方] CPL gr,adr[,xr] [機能] if <GRn> > <e> then {0→ZF; 0→SF} else if <GRn> = <e> then {1→ZF; 0→SF} else {0→ZF; 1→SF}; 0→OF} ただし,符号なし数同士の比較 [実行例] CPL GR0,COUNT 論理減算(SUBL)をしたふりをし,FRだけをセットする命令 (1語命令) [書き方] CPL gr1,gr2 [機能] 上記と同様
127
宿題: 本日配布した「第5回宿題」を最後まで完成させ,次回授業の冒頭に副手に提出すること
宿題: 本日配布した「第5回宿題」を最後まで完成させ,次回授業の冒頭に副手に提出すること 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
128
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第6回) 中島 克人
129
シフト命令 Logical shift (論理シフト) X13 X14 X15 X12 X0 X1 X13 X14 X15 X0 X1 X2
最上位ビットを特別扱いしない 左シフト時 空いたビットには 0 をシフト・イン 最後に [15]からシフト・アウトされた値が OF にセットされる 右シフト時 空いたビットには 0 をシフト・イン 最後に [0]からシフト・アウトされた値が OF にセットされる 左1ビット(これをシフト数分繰り返す) ... X13 X14 X15 X12 OF X0 X1 右1ビット(これをシフト数分繰り返す) ... X13 X14 X15 X0 OF X1 X2
130
COMET Ⅱマシンの機械命令 論理左シフト (shift left logical)命令 [実行例] SLL GR1,3
(教科書 p.24) [実行例] SLL GR1,3 論理左シフト (shift left logical)命令 [書き方] SLL gr,adr[,xr] [機能] 0→OF; e → t (シフト数); while (t≠0){ <GRn[15]>→OF; 14 → i; while (i≧0){ <GRn[ i ]> → GRn[ i+1 ]; i-1 → i }; 0 → GRn[0]; t-1 → t SZの設定
131
演習 (教科書 p.24) [実行例] SLL GR1,3 各自,右記の実行例を手計算で確かめて見よ
132
COMET Ⅱマシンの機械命令 論理右シフト (shift right logical)命令 [実行例] SRL GR1,3
(教科書 p.24) [実行例] SRL GR1,3 論理右シフト (shift right logical)命令 [書き方] SRL gr,adr[,xr] [機能] 0→OF; e → t (シフト数); while (t≠0){ <GRn[0]>→OF; 1 → i; while (i<16){ <GRn[ i ]> → GRn[ i-1 ]; i+1 → i }; 0 → GRn[15]; t-1 → t SZの設定
133
演習 (教科書 p.24) [実行例] SRL GR1,3 各自,右記の実行例を手計算で確かめて見よ
134
シフト命令 Arithmetic shift (算術シフト) X13 X14 X15 X12 X0 X1 X13 X14 X15 X0 X1
最上位ビット(符号ビットと見なす)は変化しない 左シフト時 空いたビットには 0 をシフト・イン 最後に [14]からシフト・アウトされた値が OF にセットされる 右シフト時 空いたビットには 符号ビット をシフト・イン 最後に [0]からシフト・アウトされた値が OF にセットされる 左1ビット ... X13 X14 X15 X12 OF X0 X1 (これをシフト数分繰り返す) 右1ビット(これをシフト数分繰り返す) ... X13 X14 X15 X0 OF X1 X2
135
COMET Ⅱマシンの機械命令 算術左シフト (shift left arithmetic)命令 [実行例] SLA GR1,3
(教科書 p.22) [実行例] SLA GR1,3 算術左シフト (shift left arithmetic)命令 [書き方] SLA gr,adr[,xr] [機能] 0→OF; e → t (シフト数); while (t≠0){ <GRn[14]>→OF; 13 → i; while (i≧0){ <GRn[ i ]> → GRn[ i+1 ]; i-1 → i }; 0→ GRn[0]; t-1 → t SZの設定
136
演習 (教科書 p.22) [実行例] SLA GR1,3 各自,右記の実行例を手計算で確かめて見よ
137
COMET Ⅱマシンの機械命令 算術右シフト (shift right arithmetic)命令 [実行例] SRA GR1,3
(教科書 p.22) [実行例] SRA GR1,3 算術右シフト (shift right arithmetic)命令 [書き方] SRA gr,adr[,xr] [機能] 0→OF; e → t (シフト数); while (t≠0){ <GRn[0]>→OF; 1 → i; while (i<16){ <GRn[ i ]> → GRn[ i-1 ]; i+1 → i }; t-1 → t SZの設定
138
演習 (教科書 p.22) [実行例] SRA GR1,3 各自,右記の実行例を手計算で確かめて見よ
139
シフト命令の使用例(その1) 2の倍数(2,4,8,16, …)の乗算・除算とその応用 問題:20倍するのに効率の良い方法は?
ある値の入った GRx を左1ビットシフトすると値は 21倍になる ある値の入った GRx を左3ビットシフトすると値は 23倍になる ある値の入った GRx を右1ビットシフトすると値は 21分の1になる ある値の入った GRx を右3ビットシフトすると値は 23分の1になる 21倍した値と23倍した値を加算すると10倍となる ( SLA GRx,1 ) + ( SLA GRy,3 ) 問題:20倍するのに効率の良い方法は?
140
シフト命令の使用例(その2) ビットパターンの合成
例: GRx の上位8ビットをGRyの下位8ビットに置き換えるには, ( GRx ∧ #00FF ) ∨ (SLL ( GRy ∧ #00FF),8ビット) 問題: GRx の上位8ビットを下位に,GRyの下位8ビットに上位に持つ1語をGRz上に合成する方法は? 問題: GRx の上位8ビットを #00 にするのをAND命令を用いずに行うには?
141
アセンブリ言語CASLⅡ 演習 SHFT ... -1 を1ビット算術左シフトした数(ー2)と,-1 を3ビット算術左シフトした数(ー8)を加算し,0から算術減算すると 10 になることをプログラムを書いて確かめよ SHFT START LAD GR1,-1 SLA GR1,1 LAD GR2,-1 SLA GR2,3 ADDA GR1,GR2 LAD GR0,0 SUBA GR0,GR1 ST GR0,RSLT RET RSLT DS 1 END 演習 SHFT2 ... 上記と同じ事を,論理シフト,論理減算するとどうなるかを確かめよ
142
アセンブリ言語CASLⅡ 演習 SHFT2 ... -1 を1ビット論理左シフトした数(ー2)と,-1 を3ビット論理左シフトした数(ー8)を加算し,0から論理減算するプログラムを書いて,結果を確かめよ SHFT2 START LAD GR1,-1 SLL GR1,1 LAD GR2,-1 SLL GR2,3 ADDL GR1,GR2 LAD GR0,0 SUBL GR0,GR1 ST GR0,RSLT RET RSLT DS 1 END
143
休講のお知らせ 小テストのお知らせ ★来週6月8日は休講にさせて頂きます. ★次回(第7回)は6月15日です.
★次回(第7回)の講義の後半に小テストを行う予定です.(自由席のまま) ★PCをネット接続し,課題の提出準備(教材サーバ上に提出フォルダを作成)しておいて下さい.(次頁以降に説明有り)
144
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第7回) 中島 克人
145
本日の内容 条件分岐 第1回小テスト(最後45分) データにより,処理を切り替える ループ 同じコードを何度も書かずに済ませる
= プログラムがコンパクトになり,読みやすくなる 第1回小テスト(最後45分) 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
146
プロセッサと機械語 条件分岐命令 繰り返し(ループ)にも頻繁に使用される
147
COMET Ⅱマシンの機械命令 無条件分岐(jump)命令 零分岐(jump on zero)命令 正分岐(jump on plus)命令
[書き方] JP adr[,xr] [機能] e → PR 零分岐(jump on zero)命令 [書き方] JZE adr[,xr] [機能] if ZF=1 then e → PR 正分岐(jump on plus)命令 [書き方] JPL adr[,xr] [機能] if SF=0 and ZF= then e → PR 非零分岐 (jump on non zero)命令 [書き方] JNZ adr[,xr] [機能] if ZF=0 then e → PR 負分岐(jump on minus)命令 [書き方] JMI adr[,xr] [機能] if SF=1 then e → PR オーバフロー分岐 (jump on overflow)命令 [書き方] JOV adr[,xr] [機能] if OF=1 then e → PR
148
COMET Ⅱマシンの機械命令 条件分岐命令の使い方 条件分岐命令の上手な使い方 演算か比較により FR をセット 演算か比較により
YES 条件成立時 の処理 RET YES 共通の処理 RET 条件不成立 時の処理 RET NO 条件不成立 時の処理 NO
149
アセンブリ言語CASLⅡ 演習BIGR ... CPL と JPL を使って,大きい方を求めるプログラムを作成し,WCASL Ⅱで実行せよ
なお,ラベル DAT1 には自分の学籍番号下3桁を,DAT2 には隣席学生の学籍番号の下3桁を DC せよ BIGR START LD GR0,DAT1 CPL GR0,DAT ; <GR0> と <DAT2> の大小比較 JPL L ; 結果が+(プラス)ならジャンプ LD GR0,DAT2 L ST GR0,RSLT RET DAT DC ; 自分の学籍番号の下3桁 DAT DC ; 隣席学生の学籍番号の下3桁 RSLT DS 1 END =<DAT1>
150
アセンブリ言語CASLⅡ 演習BIGR ... 素直だが上手とは言えないプログラム例 BIGR START LD GR0,DAT1
CPL GR0,GR ; <GR0> と <GR1> の大小比較 JPL L ; 結果が+(プラス)ならジャンプ ST GR1,RSLT RET L ST GR0,RSLT DAT DC 001 DAT DC 002 RSLT DS 1 END =<DAT1> =<DAT2> FR による 条件分岐 条件不成立 時の処理 RET 条件成立時 の処理 YES NO
151
アセンブリ言語CASLⅡ 演習BIGR ... 模範解答 (教科書 p.34) BIGR START LD GR0,DAT1
CPL GR0,DAT ; <DAT1> と <DAT2> の大小比較 JPL L ; 結果が+(プラス)ならジャンプ LD GR0,DAT2 L ST GR0,RSLT RET DAT DC 001 DAT DC 002 RSLT DS 1 END FR による 条件分岐 条件不成立 時の処理 共通の処理 RET YES NO
152
アセンブリ言語CASLⅡ 演習 JZE ... 下記のプログラムのDATに自分の学籍番号下3桁を入れて完成させ, RSLTに格納される結果を確かめよ JZE START LD GR0,DAT ; 学籍番号のロード AND GR0,MSK ; 最下位ビットの取り出し JZE EVEN LAD GR0,#FFFF ; #FFFF → GR0 EVEN ST GR0,RSLT ; <GR0> → RSLT RET DAT DC ; 自分の学籍番号下3桁を10進数で入力 MSK1 DC RSLT DS END このプログラムJZEの機能(何をしているのか)を言葉で説明せよ
153
アセンブリ言語CASLⅡ 演習 LDST3 ... DAT~DAT+2番地の内容をADR~ADR+2番地に格納するプログラム作成し,WCASL Ⅱで実行せよ LDST3 START LD GR0,DAT ; DAT 番地の内容を GR0 に ST GR0,ADR ; <GR0> → ADR LAD GR1, ; 1 → GR1 LD GR0,DAT,GR ; <e>(=<DAT+1>) → GR0 ST GR0,ADR,GR1 ; <GR0> → ADR+1 LAD GR1, ; 2 → GR1 LD GR0,DAT,GR ; <e>(=<DAT+2>) → GR0 ST GR0,ADR,GR1 ; <GR0> → ADR+2 RET DAT DC #0001,#0002,#0003 ; 定数#0001~#0003 を連続配置 ADR DS ; 3語分の領域 をここに確保 END 問題:DAT~DAT+9番地の内容をADR~ADR+9番地に格納するには?
154
アセンブリ言語CASLⅡ DAT~DAT+9番地の内容をADR~ADR+9番地に格納する LDST10 START 0 → GR1
<DAT+<GR1>> → GR0 <GR0> → ADR +<GR1> <GR1>+<GR2> → GR1 0番目 LDST10 START <DAT> → GR0 <GR0> → ADR 1 → GR1 <DAT+1> → GR0 <GR0> → ADR+1 2 → GR1 <DAT+2> → GR0 <GR0> → ADR+2 : 9 → GR1 <DAT+9> → GR0 <GR0> → ADR+9 RET 0番目 1番目 2番目 9番目 1番目 1 → GR2 <DAT+<GR1>> → GR0 <GR0> → ADR +<GR1> <GR1>+<GR2> → GR1 9番目 : <DAT+<GR1>> → GR0 <GR0> → ADR +<GR1> (<GR1>+<GR2> → GR1) RET
155
アセンブリ言語CASLⅡ DAT~DAT+9番地の内容をADR~ADR+9番地に格納する
LDST10 START 0 → GR1 1 → GR2 <DAT+<GR1>> → GR0 <GR0> → ADR +<GR1> <GR1>+<GR2> → GR1 : (<GR1>+<GR2> → GR1) RET 1番目 9番目 0番目 0~9番目 LDST10 START 0 → GR1 1 → GR2 <DAT+<GR1>> → GR0 <GR0> → ADR +<GR1> <GR1>+<GR2> → GR1 RET if <GR1> then ラベルLPまでジャンプ LP(ラベル) 問題:上記の に入る大小記号はどれ? (a) > (b) ≧ (c) < (d) ≦
156
アセンブリ言語CASLⅡ DAT~DAT+9番地の内容をADR~ADR+9番地に格納する 実際のプログラム LDST10 START
0 → GR1 1 → GR2 LP <DAT+<GR1>> → GR0 <GR0> → ADR +<GR1> <GR1>+<GR2> → GR1 if <GR1> < 10 then ラベルLPまでジャンプ RET LDST10 START LAD GR1,0 LAD GR2,1 LP LD GR0,DAT,GR1 ST GR0,ADR,GR1 ADDA GR1,GR2 CPA GR1,TEN JMI LP RET TEN DC 10 DAT DC X,X,X, …, X ; 定数を10連続配置 ADR DS ; 10語分の領域確保 ENDppp
157
第1回小テスト ★自由席のまま ★PCは,WCASL-Ⅱ,本科目ページのみ参照可. (他アプリ,他ページ参照は不正行為と見なします) ★教科書他,紙の資料は全て参照可. ★提出は配布した紙で
158
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第8回) 中島 克人
159
本日の内容 第1回小テストの解答 ループの構成 スタックとサブルーチン 宿題 補講(6/23(木)5限)のお知らせ 10進数 50 = 32
+ 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
160
プロセッサと機械語 第1回小テストの解答
161
課題1 解答例 ラベルDAT番地の内容(10進数で100)を8倍して,ラベルRSLT番地に格納するプログラム Q8T を作成せよ.
Q8T START LD GR0,DAT SLA GR0,3 ; 左に3ビットシフトすると8倍,SLLでも一応正解 ST GR0,RSLT RET DAT DC RSLT DS END Q8T START LD GR0,DAT ADDA GR0,GR0 ; GR0を2倍, ADDLでも一応正解 ADDA GR0,GR0 ; GR0を更に2倍, ADDLでも一応正解 ST GR0,RSLT RET (以下,略)
162
課題1 ポイント 数を掛算を使わずに 8倍する方法 珍解答例(勿論間違い)
3ビット左シフトする <DAT>→R,ShiftLeftArithmetic(R,3) 2倍を3回する <DAT>→S,S+S→S ,S+S→S ,S+S→S 8回加算する <DAT>→S,S+<DAT>→S, … ,S+<DAT>→S 珍解答例(勿論間違い) 8(= ) と 論理AND する <DAT>→S,8→M,S AND M→S (Sの8倍を数式では 8S あるいは 8・S と表記するから?)
163
課題2 解答例 ラベルDAT番地の内容(10進数で-10)を4倍した値をRSLT番地に,20倍した値をRSLT+1番地に格納するプログラム QTT を全部で(STARTからENDまで)15行以内で作成せよ. QTT START LD GR0,DAT SLA GR0, ; 左に2ビットシフトすると4倍,SLLでも正解 ST GR0,RSLT LD GR1,DAT ; 4倍の入っているGR0は残して,GR1を使用 SLA GR1, ; 左に4ビットシフトすると16倍,SLLでも正解 ADDA GR0,GR1 ; 4倍と16倍を加算すると20倍 LAD GR2, ; インデックスレジスタの準備 ST GR0,RSLT,GR2 RET DAT DC RSLT DS ; 格納場所は2語必要 END
164
課題2 ポイント 4倍したレジスタを壊さずに置いておき,別のレジスタ上に16倍を作る
インデックスレジスタを用いて RSLT+1 番地に格納する RSLT番地は DS 1 ではなく,DS 2 が必要
165
課題3 解答例 ラベルDAT番地の内容の絶対値を求めて,ラベルRSLT番地に格納するプログラム QABS を作成せよ.なお,DAT番地には -100 の代わりに 100 などを置いて動作を確かめよ. ( a の絶対値 |a| とは,|a| = a (a≧0) または |a| = -a (a<0) ) LD命令で GR0の符号はFRにセットされる QABS START LD GR0,DAT JPL STR LAD GR0,0 SUBA GR0,DAT STR ST GR0,RSLT RET DAT DC RSLT DS END QABS START LD GR0,DAT JPL STR LAD GR1,#FFFF XOR GR0,GR1 LAD GR1,1 ADDA GR0,GR1 STR ST GR0,RSLT RET DAT DC RSLT DS END X が負の時, 絶対値は 0-X で求まる X が負の時, 絶対値は Xの2の補数 計算で求まる X が負の時,絶対値は X-2X でも求まる 作:07fi144
166
課題3 ポイント 負の数の絶対値が求められない(多数) 良くあるミス
ヒントは ( a の絶対値 |a| とは,|a| = a (a≧0) または |a| = -a (a<0) ) ポイントは (<DAT>=M)<0 の時の -M の求め方 方法1: 0から引く -M → M 方法2: ビット反転して+1する M xor #FFFF → M, M+1 → M 良くあるミス 分岐後の合流をしない場合に,片方に RET を忘れる QABS START LD GR0,DAT JPL STR LAD GR1,#FFFF XOR GR0,GR1 LAD GR1,1 ADDA GR1,GR0 ST GR1,RSLT (RET) STR ST GR0,RSLT RET (以下,省略) RET がないと 次の ST が実行 されてしまう
167
課題4 解答 次の左側の10進数の加減算の結果を求め,4桁の16進数(2進数16ビット相当)で答えよ. (計算の仕方は自由である.プログラムを書き,CASL2シミュレータで求めても良い.) 1010+2010 1010-2010 2010-4010 = 10進数加減算 結果の16進数(4桁) #001E (001E16) #FFF6 (FFF616) #FFEC (FFEC16) ADSB START LD GR0,A ADDA GR0,B RET A DC ; 10-20の場合 B DC ; 10-20の場合 END プログラムを書き,CASL2シミュレータで求める場合,右図を実行し,GR0の16進数の値を読み取れば良い.
168
アセンブリ言語CASLⅡ 演習 JUF ... 下記のプログラムのDATに自分の学籍番号下3桁を入れて完成させ, RSLTに格納される結果を確かめよ JUF START LD GR0,DAT ; 学籍番号のロード CPL GR0,CMP ; 50 との大小比較 JMI UDR50 SUBA GR0,CMP ; <GR0>-50 → GR0 CPL GR0,CMP ; 50 との大小再比較 UDR50 ST GR0,RSLT ; <GR0> → RSLT RET DAT DC ; 自分の学籍番号下3桁を10進数で入力 CMP1 DC RSLT DS END
169
アセンブリ言語CASLⅡ チャレンジ問題(宿題) 演習 JUF2 ... JUF を比較命令を使用せずに書き直してみよ JUF2 START
LD GR0,DAT ; 学籍番号のロード SUBA GR0,CMP ; <GR0>-50 → GR0 JMI UDR ; (ジャンプ命令) SUBA GR0,CMP ; <GR0>-50 → GR0 JPL STR ; minus の反対は, JZE STR ; plus または zero UDR50 ADDL GR0,CMP ; <GR0>+50 → GR0 STR ST GR0,RSLT ; <GR0> → RSLT RET DAT DC ; 自分の学籍番号下3桁を10進数で入力 CMP1 DC RSLT DS END
170
プロセッサと機械語 ループの構成
171
COMET Ⅱマシンの機械命令 比較(または演算)命令と条件分岐命令によるループの実現
ループカウンタ(i:ループインデックスとも)で何回目かを制御 同じ処理をn回繰り返す i回目の処理 i = 1 i≦n ? RET i+1→ i i = 1~n の場合 YES NO i = n~1 の場合 i回目の処理 i = n i≧1 ? RET i-1→ i YES NO 処理(1回目) 処理(2回目) ・・・ 処理(n回目) RET
172
アセンブリ言語CASLⅡ 宿題 演習 STNUM ... 1,2,3~N を ADR~ ADR+(N-1)番地に格納するプログラム作成し,WCASL Ⅱで実行せよ (1) 繰り返し処理をまず考える (2) ループカウンタやインデックス・レジスタを導入する (兼用できないか検討する) (3) ループする(同じ所に戻る)か,終了するための条件分岐法を決定する (4) ループ回数に留意しながら,初期化部分を追加する K は初めに 1 にしておく(初期化) インデックス・レジスタ i は初めに 0 にしておく(初期化) (ループカウンタは K を兼用する) K → ADR+< i > K番目の値 → ADR+(K-1)番地 これを K=1 から K=N まで繰り返す if (K>N) then 終了 K + 1 → K i + 1 → i
173
アセンブリ言語CASLⅡ 宿題 演習 STNUM ... 1,2,3~N を ADR~ ADR+(N-1)番地に格納するプログラム作成し,WCASL Ⅱで実行せよ STNUM START LAD GR1, ; 1 → GR1 LAD GR2, ; 0 → GR2 (インデックスレジスタ) LOOP ST GR1,ADR,GR ; <GR1> → ADR+<GR2> CPA GR1,DAT ; GR1 と Nの値の比較 JZE FIN ; <GR1> = N ならば FIN にジャンプ LAD GR1,1,GR ; <GR1> + 1 → GR1 LAD GR2,1,GR ; <GR2> + 1 → GR2 JUMP LOOP ; LOOP に無条件ジャンプ FIN RET DAT DC N ; Nに適当な数を指定 ADR DS N ; N(上記と同じ数)を指定 END
174
アセンブリ言語CASLⅡ 宿題 演習 STNUM ... 1,2,3~N を ADR~ ADR+(N-1)番地に格納するプログラム作成し,WCASL Ⅱで実行せよ STNUM START LAD GR1, ; 1 → GR1 LAD GR2, ; 0 → GR2 (インデックスレジスタ) LOOP ST GR1,ADR,GR ; <GR1> → ADR+<GR2> CPA GR1,DAT ; GR1 と Nの値の比較 JZE FIN ; <GR1> = N ならば FIN にジャンプ LAD GR1,1,GR ; <GR1> + 1 → GR1 LAD GR2,1,GR ; <GR2> + 1 → GR2 JUMP LOOP ; LOOP に無条件ジャンプ FIN RET DAT DC N ; Nに適当な数を指定 ADR DS N ; N(上記と同じ数)を指定 END K → ADR+<i> 1 → K 0 → i RET K+1→ K i +1→ i START i回目の処理 K=N? YES NO 無条件分岐
175
アセンブリ言語CASLⅡ チャレンジ問題(宿題)
演習 STNUM ... ジャンプ命令を1箇所だけに用いて,より少ない行数のプログラムに書き直して見よ. STNUM START LAD GR1, ; 1 → GR1 LAD GR2, ; 0 → GR2 (インデックスレジスタ) LOOP ST GR1,ADR,GR ; <GR1> → ADR+<GR2> LAD GR1,1,GR ; <GR1> + 1 → GR1 LAD GR2,1,GR ; <GR2> + 1 → GR2 CPA GR2,DAT ; if (<GR2> < N) JMI LOOP ; then LOOP に条件ジャンプ FIN RET DAT DC N ; Nに適当な数を指定 ADR DS N ; N(上記と同じ数)を指定 END K → ADR+<i> 1 → K 0 → i RET K+1→ K i +1→ i START i回目の処理 i<N? YES NO
176
アセンブリ言語CASLⅡ 演習 SUMN ... 1,2,3~N の合計を SUM番地に格納するプログラム作成せよ.なお,N は DAT番地に格納されている. SUMN START LAD GR0,0 LAD GR1,1 LOOP ADDA GR0,GR1 LAD GR1,1,GR1 CPL GR1,DAT JMI LOOP JZE LOOP ST GR0,SUM RET DAT DC N ; Nに適当な数を指定 SUM DS ; 合計の格納場所 END
177
アセンブリ言語CASLⅡ 演習 SUMN ... 1,2,3~N の合計を SUM番地に格納するプログラム作成せよ.なお,N は DAT番地に格納されている. ADDA GR0,GR1 LAD GR1,1,GR1 LAD GR0,0 LAD GR1,1 RET ST GR0,SUM START CPL GR1,DAT JMI LOOP JZE LOOP YES NO LOOP S+i → S i +1→ i RET S→ SUM START I,N比較 YES NO S+i → S i +1→ i 0 → S 1 → i RET S→ SUM START i≦N? YES NO
178
アセンブリ言語CASLⅡ 演習 SUMN ... 1,2,3~N の合計を SUM番地に格納するプログラム作成せよ.なお,N は DAT番地に格納されている. SUMN START LAD GR0,0 LAD GR1,1 LOOP ADDA GR0,GR1 LAD GR1,1,GR1 CPL GR1,DAT JMI LOOP JZE LOOP ST GR0,SUM RET DAT DC N ; Nに適当な数を指定 SUM DS ; 合計の格納場所 END
179
アセンブリ言語CASLⅡ 例題 MULT0 ... ラベルDAT番地の内容(mとする)をラベルN番地の内容(nとする)倍して,ラベルRSLT番地に格納する. MULT0 START LAD GR0, ; 0 → GR0 (結果の格納用レジスタを初期化) LD GR1,N ; n → GR1 (ループの回数を数えるカウンタ i) LAD GR2, ; カウンタ i の減算用の1 LOOP ADDL GR0,DAT ; 「処理=GR0にmを足し込む」 SUBL GR1,GR2 ; カウンタ i の減算 <GR1>-1→GR1 JNZ LOOP ; カウンタ i が 0 でなければ LOOPに戻り繰り返し ST GR0,RSLT ; <GR0> → RSLT RET DAT DC ; 被乗数 m N DC ; 乗数 n (ループ回数) RSLT DS END このプログラムで LOOP 番地の ADDL は何回実行されるか? まずはプログラムを読んで予想し,次に WCASL-IIで実行して確かめよ. カウンタ i ≧ 1 の判定の代りに JNZ,即ち i ≠ 0 の判定を行っている事に注意 DATやNを変えて,実行して見よ.
180
アセンブリ言語CASLⅡ 演習 MULTN ... プログラムMULT0 を 0 から n-1 まで(n はルN番地の内容)ループするように書き換えよ. MULTN START LAD GR0, ; 0 → GR0 (結果の格納用レジスタを初期化) LAD GR1, ; 0 → GR1 (ループの回数を数えるカウンタ i) LAD GR2, ; カウンタ i の加算用の1 LOOP ADDL GR0,DAT ; 「処理=GR0にmを足し込む」 ADDL GR1,GR2 ; カウンタ i の加算 <GR1>+1→GR1 CPA GR1,N ; GR1 と 指定ループ回数の比較 JMI LOOP ; <GR1><<N> ならば LOOPに戻り繰り返し ST GR0,RSLT ; <GR0> → RSLT RET DAT DC ; 被乗数 m N DC ; 乗数 n (ループ回数) RSLT DS END JMI を使ったカウンタ i <<N> の判定の代りに JNZ,即ち i ≠<N> の判定を行っても良い
181
COMET Ⅱマシンの機械命令 ループするプログラムの準備 GRx ... ループカウンタ i のためのレジスタ
GRy ... 値1の入ったレジスタ( i を+1するため) label ... ループ処理の先頭の命令に付与 分岐方法 ... どんな演算で FR をセットし, どの条件分岐命令でそれをテストするか? i = 1~n の場合 i = 1 ヒント(1) : CPL i,n ( i-n に相当)の後, SF,ZF=0,0ならば i>n SF,ZF=0,1ならば i=n SF,ZF=1,0ならば i<n i回目の処理 i+1→ i i≦n ? ヒント(2) : JZE ... ZF=1 ならば jump JNZ ... ZF=0 ならば jump JMI ... SF=1 ならば jump JPL ... SF,ZF=0,0 ならば jump YES NO RET
182
条件分岐命令の使い分け COMET Ⅱが備える条件分岐命令の分岐条件
JPL(jump on plus) 直前の演算結果 > 0 直前の比較 <gr1> > <gr2>|<e> JMI(jump on minus) 直前の演算結果 < 0 直前の比較 <gr1> < <gr2>|<e> JZE(jump on zero) 直前の演算結果 = 0 直前の比較 <gr1> = <gr2>|<e> JNZ(jump on non zero) 直前の演算結果 ≠ 0 直前の比較 <gr1> ≠ <gr2>|<e> i回目の処理 1→i i≦n ? RET i+1→ i YES NO i回目の処理 0→i i<n ? RET i+1→ i YES NO 実現したいアルゴリズムで ≦ や ≧ がある時,ループカウンタ値をずらして < や > に置き換えられることもある. 可能なら,ループカウンタ値の増減を逆に使用しても良い.
183
プロセッサと機械語 スタックと サブルーチン
184
後入れ先だし=LIFO (Last-in First-out) という
COMET Ⅱマシンの機械命令 PUSH と POPによる stack操作 X SP stack PUSH の実行 stack に 1語保存 PUSH adr[,xr] ... 実効番地(adr[,xr])(X,Y等とする)を stackの先頭に push X SP stack POP gr ... stackの先頭の内容を レジスタ gr に pop POP の実行 最後に保存 した1語を レジスタ r に取り出し 後入れ先だし=LIFO (Last-in First-out) という X SP Y stack PUSH の実行 stack に もう1語保存 (幾らでも保存できる) SP stack 最初は stack は空 SP: Stack Pointer
185
COMET Ⅱマシンの機械命令 プッシュ(push)命令 (教科書 p.26) [書き方] PUSH adr[,xr]
[機能] <SP>-1 → SP; e → <SP> [実行例] PUSH ● ●
186
COMET Ⅱマシンの機械命令 (教科書 p.26) プッシュ(push)命令 [実行例] PUSH 0,GR3 ● ●
187
COMET Ⅱマシンの機械命令 ポップ(pop)命令 (教科書 p.27) [書き方] POP gr
[機能] <<SP>> → GRn; <SP>+1 → SP [実行例] POP GR3
188
宿題: 「第8回宿題」を次回授業の冒頭に副手に提出すること
宿題: 「第8回宿題」を次回授業の冒頭に副手に提出すること 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
189
プロセッサと機械語 補習のお知らせ 第1回(a) 日時: 6/23(木)5限(16:30~18:00頃)
場所:11号館10階1010室(定員15名程度) 第1回(b) 日時: 6/24(金)5限(16:30~18:00頃) 場所:11号館10階1009室(定員6名程度) 内容例: 機械語プログラミングの基礎 文章問題からアルゴリズム考案,そして,機械語プログラミングまで 講師:副手の増田君 希望者: 直接上記の日時・場所に集合して下さい.
190
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第9回) 中島 克人
191
第1回小テスト成績 成績別人数 (人) (点) ★ 本日第2回小テストを行いますので, なるべく 「1人おき」 に着席して下さい. 10
2010年度前期 10 20 30 40 50 60 70 80 90 100 20 10 (点) 10 20 30 40 50 60 70 80 90 100 単位取得への道は 険しいです。 今から心を入れ 替えてやり直しです。 理解できていない 部分やミスが 多いです。 復習が必要です。 よく出来ました。 これからも頑張って ついて来て下さい。
192
プロセッサと機械語 スタックと サブルーチン
193
後入れ先だし=LIFO (Last-in First-out) という
COMET Ⅱマシンの機械命令 PUSH と POPによる stack操作 X SP stack PUSH の実行 stack に 1語保存 PUSH adr[,xr] ... 実効番地(adr[,xr])(X,Y等とする)を stackの先頭に push X SP stack POP gr ... stackの先頭の内容を レジスタ gr に pop POP の実行 最後に保存 した1語を レジスタ r に取り出し 後入れ先だし=LIFO (Last-in First-out) という X SP Y stack PUSH の実行 stack に もう1語保存 (幾らでも保存できる) SP stack 最初は stack は空 SP: Stack Pointer
194
COMET Ⅱマシンの機械命令 プッシュ(push)命令 (教科書 p.26) [書き方] PUSH adr[,xr]
[機能] <SP>-1 → SP; e → <SP> [実行例] PUSH ● ●
195
COMET Ⅱマシンの機械命令 (教科書 p.26) プッシュ(push)命令 [実行例] PUSH 0,GR3 ● ●
196
COMET Ⅱマシンの機械命令 ポップ(pop)命令 (教科書 p.27) [書き方] POP gr
[機能] <<SP>> → GRn; <SP>+1 → SP [実行例] POP GR3
197
アセンブリ言語CASLⅡ 例題 REV ... DAT番地から連続する 4語の内容を,順番が逆順になるように並べ替えて,RSLT番地から連続する 4語に格納するプログラムのフローチャートとプログラムを作成せよ. 基本設計 YES PUSH <e> 4→i i>0 ? i-1→i START e+1→e 設計 DAT→e POP <e> i>0 ? RET i-1→i YES NO e+1→e 4→i RSLT→e POP命令と ST命令の組合せ START DAT番地 から DAT+(4-1)番地 までの内容を PUSH RET POPを繰り返して, RSLT番地 から RSLT+(4-1)番地 までに格納 機械命令は PUSH e しか出来ないので, LD命令 と PUSH命令の組合せで実現 NO
198
アセンブリ言語CASLⅡ 例題 REV ... DAT番地から連続する 4語の内容を,順番が逆順になるように並べ替えて,RSLT番地から連続する 4語に格納するプログラムのフローチャートとプログラムを作成せよ REV START LAD GR1,DAT ; DAT→e (<GR1>) LAD GR2, ; ループカウンタ i=4 に初期化 LAD GR3, ; ループカウンタの減算値1 LOOP1 LD GR4,0,GR1 ; 次と2つの命令で PUSH <e> (GR0は使えない!) PUSH 0,GR ; LAD GR1,1,GR1 ; アドレスの加算 e+1→e (GR0は使えない!) SUBL GR2,GR3 ; ループカウンタのデクリメント i-1→i JPL LOOP ; i>0 ならば LOOP1に戻り繰り返し LAD GR1,RSLT ; RSLT→e ; ここから後半だが,<GR3>はそのまま使用 LAD GR2, ; ループカウンタ i=4 に初期化 LOOP2 POP GR ; POP ST GR4,0,GR1 ; <e>に格納 LAD GR1,1,GR1 ; アドレスの加算 e+1→e JPL LOOP ; i>0 ならば LOOP2に戻り繰り返し RET DAT DC 100,200,300,400 RSLT DS 4 END LAD GR1,RSLT ; RSLT→e ; ここから後半だが,<GR3>はそのまま使用 LAD GR2, ; ループカウンタ i=4 に初期化 LOOP2 POP GR ; POP ST GR4,0,GR1 ; <e>に格納 LAD GR1,1,GR1 ; アドレスの加算 e+1→e SUBL GR2,GR3 ; ループカウンタのデクリメント i-1→i JPL LOOP ; i>0 ならば LOOP2に戻り繰り返し RET
199
COMET Ⅱマシンの機械命令 コール(call subroutine)命令 スーパーバイザコール(supervisor call)命令
[書き方] CALL adr[,xr] [機能] <SP>-1 → SP; <PR> → <SP>; e → PR スーパーバイザコール(supervisor call)命令 [書き方] SVC adr[,xr] [機能] 略 リターン (return from subroutine)命令 [書き方] RET [機能] <<SP>> → t; <SP>+1 → SP; <t> → PR ノーオペレーション (no operation)命令 [書き方] NOP [機能] (何もしない)
200
サブルーチンの構成(1) データは異なるが同じ処理を何度も繰り返す場合,データを受け取って処理を行う部分をサブルーチンとする
(教科書 p.53) データは異なるが同じ処理を何度も繰り返す場合,データを受け取って処理を行う部分をサブルーチンとする プログラム(親プログラム) サブルーチン(副/子プログラム) : : : (データ1 準備) CALL SUB (データ2 準備) (データ3 準備) SUB START (データアクセス) : : : (データ 処理) (結果 格納) RET END CALL命令は, 次命令の番地をスタックにPUSHし, SUB番地に分岐 RET命令は,スタックから 戻り先番地をPOPしてその番地に分岐 データをサブルーチンに渡し(アクセスできるようにし),結果データを呼び出し元のプログラムに返す(アクセスできるようにする) ⇒ これらのデータを引数(parameter/argument)と言う
201
COMETⅡマシンの機械命令 CALL adr[,xr] と RET によるサブルーチンの実現 stack を戻り番地の保存に使用
memory上の program PR YY XX CALL ● : RET BB AA adr[,xr] PR YY XX CALL ● : RET BB AA ZZZZ SP XXの番地 CALL の実行 stack PR YY XX CALL ● : RET BB AA ZZZZ SP XXの番地 サブ ルーチン の終了 stack PR YY XX CALL ● : RET BB AA ZZZZ SP の実行 stack サブ ルーチン SP ZZZZ stack stack を戻り番地の保存に使用 (注:実際には汎用レジスタの内容等の退避も必要)
202
サブルーチンの構成(2) 引数の受渡しは汎用レジスタかスタックを用いる (教科書 p.54)
サブルーチンは呼び出し元のプログラムで使用しているラベルは知らないので汎用レジスタに(入力)データを入れる サブルーチン例 親プログラム S4T START (GRx → M) : : : (M×4 計算) (結果 → GRy) RET END GRx : : : LD GRx,D1 CALL S4T ST GRy,R1 LD GRx,D2 ST GRy,R2 GRx GRy GRy D1 データ1 : : R1 結果1 D2 データ2 R2 結果2
203
サブルーチンの構成(3) 引数の受渡しは汎用レジスタかスタックを用いる (教科書 p.54)
汎用レジスタに親プログラムで使用している番地を入れても良い サブルーチン例 親プログラム S4T START (<GRx> → M) : : : (M×4 計算) (結果 → GRy) RET END GRx : : : LAD GRx,D1 CALL S4T ST GRy,R1 LAD GRx,D2 ST GRy,R2 GRy 結果格納番地をGRyに入れて渡しても良い LAD GRy,R1 D1 データ1 : : R1 結果1 D2 データ2 R2 結果2 その場合, STもサブルーチン内で行える ST 結果,0,GRy スタックも便利である
204
アセンブリ言語CASLⅡ 演習 SUB1 ... <GR1>番地(e=GR1に格納されている番地)から連続する4語の内容を加算し,GR0に格納する副プログラム(サブルーチン)を作成せよ. 4→i SUB1 0→s 設計 ; 加算結果 s=0 に初期化 ; ループカウンタ i=4 に初期化 ; メモリ(e番地)から1語ロードし,s に加算 ; アドレス(e番地)の加算 e+1→e ; ループカウンタのデクリメント i-1→i ; i>0 ならば 繰り返し s + <e>→s i>0 ? RET i-1→i YES NO e+1→e
205
アセンブリ言語CASLⅡ 演習 SUB1 ... <GR1>番地から連続する4語の内容を加算し,GR0に格納する副プログラム(サブルーチン)を作成せよ. 実装 SUB1 START XOR GR0,GR0 ; 加算結果を収納するGR0を 0 に初期化 LD GR2,N ; ループカウンタを <N>=4 に初期化 LAD GR3, ; ループカウンタの減算値1 LOOP ADDA GR0,0,GR1 ; メモリ(e=<GR1>)から1語ロードし,加算 LAD GR1,1,GR1 ; アドレスの加算 <GR1>+1→GR1 SUBL GR2,GR3 ; ループカウンタのデクリメント <GR2>-1→GR2 JPL LOOP ; <GR1>>0 ならば LOOPに戻り繰り返し RET ; 加算結果は GR0 にあるので,そのままリターン N DC ; 指定ループ回数 END このサブルーチンは入力が GR1 (番地情報),出力が GR0 (加算結果)であるが, 主プログラムでは,これを呼び出した後,レジスタ等にどういう変化が起こるか?
206
アセンブリ言語CASLⅡ 演習 SUB2 ... SUB1をGRの値を変更しないように改良せよ.
SUB2 START PUSH 0,GR ; GR1 の内容をスタックに退避 PUSH 0,GR ; GR2 の内容をスタックに退避 PUSH 0,GR ; GR3 の内容をスタックに退避 XOR GR0,GR0 ; 加算結果を収納するGR0を 0 に初期化 LD GR2,N ; ループカウンタを <N>=4 に初期化 LAD GR3, ; ループカウンタの減算値1 LOOP ADDA GR0,0,GR1 ; メモリ(e=<GR1>)から1語ロードし,加算 LAD GR1,1,GR1 ; アドレスの加算 <GR1>+1→GR1 SUBL GR2,GR3 ; ループカウンタのデクリメント <GR2>-1→GR2 JPL LOOP ; <GR1>>0 ならば LOOPに戻り繰り返し POP GR ; GR3 の内容をスタックから復元 POP GR ; GR2 の内容をスタックから復元 POP GR ; GR1 の内容をスタックから復元 RET ; 加算結果は GR0 にあるので,そのままリターン N DC ; 指定ループ回数 END GR0, GR4~GR7, FR はスタックに退避していないが,何故か?
207
アセンブリ言語CASLⅡ 演習 CAL ... 左下の主プログラムにおいて,SUB1の呼び出しによってGR1,GR2,GR3の内容が壊れても良いように改良せよ. 改良前 改良後 CAL START : LAD GR1,DAT ; SUB1の入力 ; (GR1=e)の準備 CALL SUB1 ; ループカウンタを ; <N>=4 に初期化 DAT DS 4 CAL START : PUSH 0,GR2 PUSH 0,GR3 LAD GR1,DAT ; SUB1の入力 ; (GR1=e)の準備 CALL SUB1 ; ループカウンタを ; <N>=4 に初期化 POP GR3 POP GR2 (LAD GR1,DAT) ; 必要なら DAT DS 4 改良後の主プログラムから SUB1 に代えて SUB2 を呼び出したらどうなるか?SUB2 からリターンした直後のスタックの様子を図示せよ.
208
CASL Ⅱのマクロ命令 レジスタプッシュ(rpush)命令 レジスタポップ(rpop)命令
[説明] GR の内容を,GR1, ... ,GR7 の順序でスタックにプッシュする. レジスタポップ(rpop)命令 [書き方] RPOP [説明] スタックからポップし,GR7, ... ,GR1 の順序で GR に格納する. 演習 SUB2 の解答内の PUSH,POP命令に代えて,RPUSH, RPOP命令を用いる場合の長所・短所を考察せよ.
209
実効番地と即値について(確認) 命令によって 実効番地 adr[,xr] の使われ方が異なる事に注意
実効番地e=アドレス+ <xr> 実効番地e=即値+ <xr> load命令 LD gr, adr [,xr] [機能] <e> → GRn; 0→OF; load address命令 LAD gr, adr [,xr] [機能] e → GRn [実行例] LD GR1,1000 [実行例] LAD GR3,COUNT 即値を取る 他の命令 SLA gr, val [ ,xr ] SRA gr, val [ ,xr ] SLL gr, val [ ,xr ] SRL gr, val [ ,xr ] PUSH val [ ,xr ]
210
<GR1>+<GR0>-1番地 <GR1>+<GR0>-1番地
アセンブリ言語CASLⅡ 演習 SUB3 ... <GR1>番地から連続する<GR0>語の内容を,順番が逆順になるように並べ替える副プログラムのフローチャートとプログラムを作成せよ.(GR0,GR1以外のGRは非破壊で) PUSH <e> <GR0>→i i>0 ? i-1→i YES NO SUB3 e+1→e 設計 <GR1>→e レジスタ退避 SUB3 <GR1>番地 から <GR1>+<GR0>-1番地 までの内容を PUSH 基本設計 POP <e> i>0 ? RET i-1→i YES NO e+1→e <GR0>→i <GR1>→e レジスタ復元 内部利用レジスタの退避 内部利用レジスタの復元 RET POPを繰り返して, <GR1>番地 から <GR1>+<GR0>-1番地 までに格納
211
アセンブリ言語CASLⅡ 演習 SUB3 ... <GR1>番地から連続する<GR0>語の内容を,順番が逆順になるように並べ替える副プログラムのフローチャートとプログラムを作成せよ.(GR0,GR1以外のGRは非破壊で) SUB3 START RPUSH LD GR2,GR1 ; <GR1>→e LD GR3,GR0 ; ループカウンタ i=<GR0> に初期化 LAD GR4, ; ループカウンタの減算値1 LOOP1 LD GR5,0,GR2 ; 次と2つの命令で PUSH <e> PUSH 0,GR ; LAD GR2,1,GR2 ; アドレスの加算 e+1→e SUBL GR3,GR4 ; ループカウンタのデクリメント i-1→i JPL LOOP ; i>0 ならば LOOP1に戻り繰り返し ; ここから後半だが,e=<GR1>, i=<GR0>, <GR4>=1 はそのまま使用 LOOP2 POP GR ; POP ST GR5,0,GR1 ; <e>に格納 LAD GR1,1,GR1 ; アドレスの加算 e+1→e SUBL GR0,GR4 ; ループカウンタのデクリメント i-1→i JPL LOOP ; i>0 ならば LOOP2に戻り繰り返し RPOP RET END
212
アセンブリ言語CASLⅡ サブルーチンの引数(復習) : (教科書 p.53,54)
演習SUB1~3において, GR0 や GR1 は親プログラムとサブルーチンとの間で(直接または間接的に)データのやりとりを行うために用いられている.サブルーチンとのやり取りデータを引数(パラメータやアーギュメントとも)という.入力引数と出力引数がある. サブルーチンの共用のため,通常固定したメモリ領域を引数とはしない GR自身に入出力引数値を入れる場合と,GRに入力引数値の入った(出力引数値の格納される)メモリ領域への番地を入れる場合がある 呼び出し元プログラム サブルーチン(副プログラム) 値渡し GR0 引数値 GR0 引数値 番地渡し GR1 番地 ● GR1 番地 ● : 引数値 引数値 主記憶上 引数値
213
プロセッサと機械語 補習のお知らせ 第2回(a) 日時: 6/30(木)5限(16:30~18:00頃)
第2回(b) 日時: 6/29(水)4限(14:50~16:20頃) 場所:11号館10階1009室(第1回(b)参加者+β ) 内容例: 文章問題からアルゴリズム考案,そして,機械語プログラミングまで ループとサブルーチンの基礎 講師:副手の増田君 希望者: 第1回参加者は直接上記の日時・場所に集合して下さい +α,+βの人は授業後申し出て下さい.
214
宿題: 科目HPに掲載される「第2回小テスト」の解答例を良く復習しておくこと.
10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
215
第2回小テスト ★PCは,WCASL-Ⅱ,本科目ページのみ参照可. (他アプリ,他ページ参照は不正行為と見なします) ★教科書他,紙の資料は全て参照可. ★提出は配布した紙で ★時間はチャイムまで
216
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第10回) 中島 克人
217
本日の内容 入出力操作(マクロ命令) 文字コード操作 補習と来週の期末試験のお知らせ 授業評価 10進数 50 = 32 + 16 + 2
2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
218
CASL Ⅱのマクロ命令 マクロ命令 レジスタプッシュ(rpush)命令 レジスタポップ(rpop)命令 入力(in)命令
機会命令の列に名前(マクロ名)を付けたもの. CASL Ⅱではユーザ定義は無く,下記の4命令だけ. レジスタプッシュ(rpush)命令 [書き方] RPUSH [説明] GR の内容を,GR1, ... ,GR7 の順序でスタックにプッシュする. レジスタポップ(rpop)命令 [書き方] RPOP [説明] スタックからポップし,GR7, ... ,GR1 の順序で GR に格納する 入力(in)命令 [書き方] と [説明] は次頁. 出力(out)命令
219
CASL Ⅱのマクロ命令 入力(in)命令 出力(out)命令 (教科書 p.31)
[書き方] IN s,t (s : 256語の領域のラベル, t : 1語の領域のラベル) [説明] 1レコード(KB入力であれば1行)の文字データを読み込み, そこに含まれる文字を1語1文字の割りで領域sの先頭から順に格納する. 第7~0ビットに文字コード(ASCIIコード)を,第15から8ビットに0を入れる. レコードの区切り符号(KB入力の際の復帰符号など)は格納されない. tには入力された文字数が入る.FRの値は「不定」となる. 1語 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 ? 出力(out)命令 [書き方] OUT s,t (s : 256語の領域のラベル, t : 1語の領域のラベル) [説明] 領域sに1語1文字の割りで格納された文字データを tに格納された文字数だけ,1レコードとして出力する.レコードの区切り記号は必要であれば自動的に付加される. 各語の第7~0ビットを文字コード(ASCIIコード)と見なし,第15から8ビットは無視される.FRの値は「不定」となる.
220
データの計算機内部表現 ASCIIコード (教科書 p.31)
空白文字 ASCIIコード b6~b4 b3~b0 000 001 010 011 100 101 110 111 0000 NUL DLE SP @ P ′ p 0001 SOH DC1 ! 1 A Q a q 0010 STX DC2 " 2 B R b r 0011 ETX DC3 # 3 C S c s 0100 EOT DC4 $ 4 D T d t 0101 ENQ NAC % 5 E U e u 0110 ACK SYN & 6 F V f v 0111 BEL ETB ' 7 G W g w 1000 BS CAN ( 8 H X h x 1001 HT EM ) 9 I Y i y 1010 LF/NL SUB * : J Z j z 1011 VT ESC + ; K [ k { 1100 FF FS , < L \ l | 1101 CR GS - = M ] m } 1110 SO RS . > N ^ n ~ 1111 SI US / ? O _ o DEL ASCII コードは 7ビットであるが,COMETⅡでは最上位1ビットに 0 を足した8ビットを文字コードとしている. また,右記赤文字のコードは制御コードと称し, COMETⅡでは文字コードとしては定義されていない. 従って,文字列として CASL Ⅱプログラム上では表記できない
221
CASL Ⅱのマクロ命令 H e l l o 入力(in)命令の説明図 s,t s : IN s,t IN の呼び出し → 入力待ち H e
ユーザプログラム OSの副プログラム群 IN s,t s,t スーパーバイザ・コール IN の呼び出し → 入力待ち s : H e l o 文字列を格納 キーボードから Hello という 文字列を受け取ったとする 文字数を 格納 5 256語 (DS命令で 256文字分 を確保) H e l l o 文字数 t
222
CASL Ⅱのマクロ命令 出力(out)命令の説明図 s,t s Hello : OUT s,t OUT の呼び出し → 出力 H e l
ユーザプログラム OSの副プログラム群 OUT s,t s,t スーパーバイザ・コール OUT の呼び出し → 出力 s : H e l o 文字列を読み出す ディスプレイに Hello という 文字列を 5 文字表示する 文字数を 読み出す 256語 (DS命令で 256文字分 を確保) Hello 文字数 t 5
223
CASL ⅡのIN命令 IN命令で ABab という文字コードを STR番地に読み込むと,
アルファベット大文字(A~Z)のコードは #41 ~ #5A である アルファベット小文字(a~z)のコードは #61 ~ #7A である IN命令で 813 という文字コードを STR番地に読み込むと, STR番地から連続した3語に #0038, #0031, #0033 が格納される 数字 0 ~ 9 の文字コードは #30 ~ #39 であるので, 文字コードの入った語から #0030 をから引くと,その数字の値が求まる
224
文字コード操作 プロセッサと機械語 数字(10進数/16進数)を表す文字コード(列)から 値(計算機の内部表現)への変換
数字(10進数/16進数)を表す文字コード(列)から 値(計算機の内部表現)への変換 値(計算機の内部表現)から 文字コード(列) (10進数/16進数)への変換
225
1桁の数字(10進数)を値に 1桁の数字(16進数)を値に 数字 0 ~ 9 の文字コードは #30 ~ #39
メモリに10進数値 0~9 を表す文字コード(#0030~#0039)が入っている 値(計算機の内部表現)に変換するには #0030 を減算すれば良い 1桁の数字(16進数)を値に アルファベット大文字(A~F)のコードは #41 ~ #46 メモリに16進数値 0~F を表す文字コード(#0030~#0039,#0041~#0046) が入っている. 値(計算機の内部表現)に変換するには まず #0030 を減算して,その値が 9 より小さければそのままに, 大きければ更に #0007を減算する(#0037減算したことになる)
226
任意桁の数字(10進数)を値に 任意桁の数字(16進数)を値に
メモリに任意桁の10進数値の文字コードが上位桁から並んで入っている.値に変換するには, 0~9 なので #0030 を減算し,下位桁があれば 10倍する. それを合計に加え,下位桁がなくなるまでこれを繰り返す. 任意桁の数字(16進数)を値に メモリに任意桁の16進数値の文字コードが上位桁から並んで入っている.値に変換するには, 0~9 ならば #0030 を減算し,下位桁があれば 16倍(4ビット左シフト)する. A~F ならば #0037 を減算し,下位桁があれば 16倍(4ビット左シフト)する. それを合計に加え,下位桁がなくなるまでこれを繰り返す.
227
任意桁の数字(10進数)を値に (教科書 p.45) 例題 DECTOBIN ... IN命令で数字0~9を複数文字読み込み,それを10進数と解釈して値(計算機の内部表現)に変換して BIN番地に格納せよ 解説: IN命令で 813 という文字コードを STR番地に読み込むと, STR番地から連続した3語に #0038, #0031, #0033 が格納される. そこで,#0008,#0001,#0003 を取り出し, ((8×10)+1)×10)+3) を求めて,BIN番地に格納すれば良い. 数字 0 ~ 9 の文字コードは #30 ~ #39 であるので, 文字コードの入った語から #0030 をから引くと,その数字の値が求まる 先頭の値(8)から順に「10倍しては足し合わせ」を文字数回(3回)行うと, 求めたい値の内部表現(2進数)が下記のように求まる ( (8×10)+1)×10)+3) 10倍しては足し合わせ
228
任意桁の数字(10進数)を値に (教科書 p.45) 例題 DECTOBIN ... IN命令で数字0~9を複数文字を読み込み,それを10進数と解釈して値(計算機の内部表現)に変換して BIN番地に格納せよ 設計: 文字数を N,文字コードから #30 を引いた値を V, 10進数の内部表現の値を S (初期値0) とすると, N =0 なら何もせずに終了, N =1 なら V→S として終了, N ≧2 なら 10×S+V→S,ループカウンタ i+1→i で繰り返し. YES DECTOBIN IN命令で読込み RET S→<BIN> i=N ? 0→S 0→i 10×S→S 1文字→C C-#30→V S+V→S i+1→i i=N ? NO 文字列バッファ(配列)を 上から順にアクセス するので, ループカウンタ i を 0 ~ N-1 と使えば, インデックスレジスタ と共用できる NO 1文字→C C-#30→V S+V→S i+1→i i=N ? 1列に並べる YES
229
任意桁の数字(10進数)を値に 例題 DECTOBIN ... IN命令で数字0~9を複数文字を読み込み,それを10進数と解釈して値(計算機の内部表現)に変換して BIN番地に格納せよ YES DECTOBIN IN命令で読込み 0→S 0→i RET S→<BIN> i=N ? NO 10×S→S 1文字→C C-#30→V S+V→S i+1→i YES DECTOBIN IN命令で読込み 0→S 0→i RET S→<BIN> i=N ? NO 10×S→S 1文字→C C-#30→V S+V→S i+1→i YES DECTOBIN IN命令で読込み 0→S 0→i RET S→<BIN> i=N ? NO 10×S→S 1文字→C C-#30→V S+V→S i+1→i 1列に並べる RET が 下になる 様に 並び替え i=1の時も 10×S→S をする事に して構造を 簡単化
230
任意桁の数字(10進数)を値に (教科書 p.45) 例題 DECTOBIN ... IN命令で数字0~9を複数文字を読み込み,それを10進数と解釈して値(計算機の内部表現)に変換して BIN番地に格納せよ DECTOBIN START IN STR,LEN XOR GR0,GR ; 0 → GR0 (S:2進数集計用) XOR GR1,GR ; 0 → GR1 (i:ループカウンタ&インデックシング) CPA GR1,LEN ; i =文字数 ? JZE LAST ; 文字数=0の場合も有り得る LOOP LD GR2,GR ; S のコピー (GR2はワーク用) SLA GR0, ; Sの8倍 SLA GR2, ; Sの2倍 ADDA GR0,GR ; Sの10倍 LD GR2,STR,GR1 ; 1文字取り出し SUBA GR2,=# ; 文字コード-#0030 ADDA GR0,GR ; S+V→S LAD GR1,1,GR ; ループカウンタを+1 CPA GR1,LEN ; i =文字数 ? JNZ LOOP ; if ループカウンタ≠文字数 goto LOOP LAST ST GR0,BIN ; 結果の格納 RET BIN DS ; 結果の2進数格納場所 LEN DS ; 文字数格納場所 STR DS ; 入出力バッファ END
231
CASL ⅡのOUT命令 IN命令で ABab12 という文字コードを STR番地に読み込み, それをそのまま OUT命令で 出力して見よう
アルファベット大文字(A~Z)のコードは #41 ~ #5A である アルファベット小文字(a~z)のコードは #61 ~ #7A である 10進数字(0~9)のコードは #30 ~ #39 である OUT命令実行
232
値0~9を1桁の数字(10進数)に 値0~Fを1桁の数字(16進数)に 数字 0 ~ 9 の文字コードは #30 ~ #39
レジスタに値 0~9 (=#0000~#0009) が入っているなら, 出力(印字)するには #0030 を加算して文字コードに変換し, メモリに置いてOUT命令で出力(文字数は1) 値0~Fを1桁の数字(16進数)に アルファベット大文字(A~F)のコードは #41 ~ #46 レジスタに値 0~F (=#0000~ #000F) が入っている場合, 16進表記で出力するならその値を調べ, 0~9 ならば #0030 を加算し,A~F ならば #0037 を加算して 文字コードに変換し,メモリに置いてOUT命令で出力(文字数は1)
233
値を任意桁の数字(10進数)に 値を任意桁の数字(16進数)に レジスタに任意の非負整数値 (#0000~ #7FFF) が入っている
10進表記で出力するならその値を除算できなくなる10で除算を繰り返す 最初の除算の余りが10進表記の最下位桁,最後の余りが最上位桁 各桁に #0030 を加算し文字コードに変換して桁数だけの文字数を出力 値を任意桁の数字(16進数)に レジスタに任意の非負整数値 (#0000~ #7FFF) が入っている 16進表記で出力するならその値を4ビットずつ上位から1桁ずつ調べ, 0~9 ならば #0030 を加算し,A~F ならば #0037 を加算して文字コードに 桁数だけこれを繰り返し,最後に出力
234
値を任意桁の数字(10進数)に 例題 BINTODEC ... M番地の値を10進数字(0~9を表す文字)に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. ただし,M番地の値は非負整数とし,出力時には前ゼロは無しとする. 例: M番地に 813 (10進数)という値が入っている場合,BUF番地から連続した3語に #0038, #0031, #0033 を格納し,LEN番地に 3 を格納した後に,OUT命令を実行する. ポイントおよび設計 M番地の2進数(内部表現)m を10進数(BCD)d に変換する必要がある mを10で割ると,余りがdの最下位桁の値となり,商をまた10で割った余りがその上の桁の値となり,... 以下同様である 10で割るのに サブルーチンDIVTEN を用意したい 最下位桁から求まるが,BUFには最上位から格納しなくてはならないので,スタックを用いる push時に#0030を加え,文字コードに変換してしまう 何桁になるかは予め分からないので,スタックに番兵(終了印:例えば,数字以外の文字として 0)を入れておき,それが取り出されたら終了とする.
235
CASLプログラミング(サブルーチン) 演習 DIVTEN ... GR1 の内容(≧0)を 1010 で除算(割算)し,
商を GR2 に,余りを GR1 に戻すサブルーチンを作成せよ. なお, GR1 と GR2以外のGRの内容は破壊しない事. DIVTEN START XOR GR2,GR ; 0 → GR2 (Q:商) D CPA GR1,TEN ; R と 除数=10 の比較 JMI D ; R < 10 ならば終了 LAD GR2,1,GR2 ; Q+1 → Q SUBA GR1,TEN ; R-除数 → R JUMP D1 D RET TEN DC 10 END
236
値を任意桁の数字(10進数)に 例題 BINTODEC ... M番地の値を10進数字(0~9を表す文字)に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. ただし,M番地の値は非負整数とし,出力時には前ゼロは無しとする. M番地 #032D(=813) 10で割る (DIVTEN) #0033 文字コード化 商 #0051(=81) 余り #0003 #0033 BUF番地 #0038 10で割る (DIVTEN) #0031 #0033 #0031 文字コード化 #0038 商 #0008(=8) 余り #0001 #0031 10で割る (DIVTEN) stop 番兵(0) #0038 文字コード化 stack 商 #0000(=0) 余り #0008
237
値を任意桁の数字(10進数)に 例題 BINTODEC ... M番地の値を10進数字(0~9を表す文字)に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. ただし,M番地の値は非負整数とし,出力時には前ゼロは無しとする. BINTODEC 0→L push(番兵) <M>→m pop(c) DIVTEN(m,Q,R) push(#0030+R) c→<BUF(L)> L+1→L Q=0? pop(c) YES c=番兵? NO NO YES Q→m OUT BUF,L RET
238
値を任意桁の数字(10進数)に 例題 BINTODEC ... M番地の値を10進数字(0~9を表す文字)に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. ただし,M番地の値は非負整数とし,出力時には前ゼロは無しとする. BINTODEC START ; M番地の内容の10進数に変換して出力する PUSH ; push(番兵=0) LD GR1,M ; <M>→m (変換対象内部表現) D1 CALL DIVTEN ; GR1/10 → 商GR2, 剰余GR1 PUSH #0030,GR ; push #0030+GR1(剰余の文字コード) LD GR1,GR ; GR2 → GR1 JNZ D ; GR1≠0 なら繰り返し POP GR ; pop(c),GR1=L は既に 0 D2 ST GR2,BUF,GR1 ; c→<BUF(L)> LAD GR1,1,GR ; L+1→L POP GR ; pop(c) OR GR2,GR ; GR2のゼロチェック JNZ D ; 番兵=0 でなければ繰り返し ST GR1,L ; 文字数の格納 OUT BUF,L ; 出力 RET M DS ; 10進数で出力したい値 L DS ; 出力文字数 BUF DS ; 出力バッファ END
239
値0~Fを1桁の数字(16進数)に 演習 SUBHEX … GR1に16進数1桁(#0000~ #000F) が入っている. これを文字コード(#0030~#0039,#0041~#0046)に変換し,GR1 に戻すサブルーチンを作成せよ.なお,GR1以外のGRの内容は破壊しない事. SUBHEX START LAD GR1,#0030,GR1 ; 0~9 のつもりで #0030 を加算 CPA GR1,ZZ3A ; #003A と比較 JMI FIN ; < #003A ならば終了 LAD GR1,#0007,GR1 ; A~F だったので更に #0007 を加算 FIN RET ZZ3A DC #003A END
240
値を任意桁の数字(16進数)に 演習 VTOHEX … GR0に非負整数(#0000~#7FFF) が入っている. これをサブルーチンSUBHEXを使用して,4桁の16進数文字コードに変換し,STR~STR+3番地に格納するプログラムを作成せよ. VTOHEX START LAD GR2, ; 格納用インデックス・レジスタ LAD GR3, ; シフト数 LOOP LD GR1,GR ; GR0は保存 SRL GR1,0,GR ; 当該桁を1番下に AND GR1,=#000F ; 最下位桁以外をマスクアウト CALL SUBHEX ; GR1の内容は文字コードになる ST GR1,STR,GR2 ; メモリに格納 LAD GR2,1,GR ; インデックス・レジスタを+1 SUBL GR3,=#0004 ; シフト数を-4 JPL LOOP ; その結果,シフト数が正ならループ JZE LOOP ; シフト数が0でもループ RET STR DS 4 END
241
プロセッサと機械語 補習のお知らせ 第3回(a) 日時: 7/7(木)5限(16:30~18:00頃)
場所:11号館10階1010室(第2回(木曜)参加者+α) 第3回(b) 日時: 7/6(水)4限(14:50~16:20頃) 場所:11号館10階1009室(第2回(水曜)参加者+β ) 内容例: ループとサブルーチン 文字列操作と入出力 講師:副手の増田君 希望者: 参加者は直接上記の日時・場所に集合して下さい +α,+βの人は授業後申し出て下さい.
242
★ 来週は冒頭に少し「まとめ」を行った後, 期末試験を行います
★ 来週は冒頭に少し「まとめ」を行った後, 期末試験を行います 問題は宿題や小テストと同様 範囲は全部 ★ 本日,授業評価をお願いします ★ 今週は宿題はありません. 期末試験に備えてしっかり復習して 来てください. ★ 補習を受ける人は科目HPの案内を 見て下さい
243
中島 克人 情報メディア学科nakajima@im.dendai.ac.jp
プロセッサと機械語 2年次前期 (第11回) 中島 克人
244
本日の内容 ★なるべく隣を空けて着席(自由席) まとめ 期末試験 244 10進数 50 = 32 + 16 + 2 2進数 100000
2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8 244 244
245
プロセッサと機械語 CASLⅡのまとめ
246
アセンブリ言語CASLⅡ 命令の種類 文法 ... 1行に1命令ずつ記述する (教科書 p.29)
機械命令 ... LD, ST, ADDA, JP, RET マクロ命令 ... IN, OUT, RPUSH, RPOP アセンブラ命令 プログラムの構造の指示 ... START, END データ語生成の指示 ... DC, DS 文法 ... 1行に1命令ずつ記述する ラベル ... 番地の記号的表現 先頭英字で始まる1~8文字の英数字(英字は大文字) GR0, ... , GR7 はラベルとしては使用不可 行の先頭(第1桁)から記述しなくてはならない 命令 ラベルの後に1文字以上の空白を置く ラベルが無い場合は行の先頭(第1桁)を空けて第2桁以降に 命令コード と オペランド 間は1文字以上の空白を置く 複数のオペランド 間は空白を入れない 注釈 ... 行中の任意位置の「;」から行末まで
247
アセンブリ言語CASLⅡ 文法(続) (教科書 p.29) 機械命令の記述形式
op gr,adr[,xr] op adr[,xr] op gr1,gr2 op gr op op(命令コード) ... LD, ST, ADDA, etc. gr(汎用レジスタ) ... GR0 ~ GR7 xr(インデックスレジスタ) ... GR1 ~ GR7 adr ラベル どこかの行で定義されていなくてはならない 10進定数 進数字の列で,先頭に「-(マイナス)」があっても良い -1 と 65535,-2 と 65534,... は同じと見なす 16進定数 ... 「#」の後に4桁の16進数字 リテラル ... 「=」の後に 10進定数,16進定数または文字定数 それらの格納された番地を示す
248
アセンブリ言語CASLⅡ 定数の表記 文字定数(文字列)(シングルクォート「'」で囲む ) リテラル(=) (教科書 p.29)
'abc' abc という文字列 DC 'abc' abc という文字列を3語に格納 #0061 #0062 #0063 リテラル(=) 「=」の後に10進定数,16進定数,文字定数(文字列),ラベルを書くと,それらを格納(DC)した番地を生成する事が出来る. 例: = DC 10 を自動的に挿入し,その番地を表す #000A LD GR0,TEN LD GR0,= : : : TEN DC 10 #0062 LD GR0,BIE LD GR0,='b' : : : BIE DC 'b'
249
アセンブリ言語CASLⅡ 演習 LITST ... リテラルや文字定数を使用し,どのようなコードが生成されるか確認せよ(実行もして見よ).
LITST START LD GR0,= ; DC 1 が自動挿入されるか? LD GR1,='a' ; DC 'a' が自動挿入されるか? LAD GR2,='bcde' ; DC 'bcde' が自動挿入されるか? ST GR1,0,GR2 ; 'bcde' の置かれた番地の先頭に ‘a’ を格納 RET STR DC 'abc+def' ; 7語分になるか? END
250
アセンブリ言語CASLⅡ アセンブリ言語の有り難味は? 機械語での数字を記号(mnemonic)で書ける
[例] → ADDA GR3,DAT,GR5 参照番地(ラベル位置)を自動計算してくれる 挿入 ADDA 3,DAT2,3 0103 xxxxxxxx ADDA GR3,DAT,GR5 0104 xxxxxxxx JUMP LAB DAT: #0001 LAB: 参照先番地 がずれる
251
CASLプログラミング ポイント総括1 要求仕様の確認 フローチャートの活用 ループの構成 配列のアクセス
入力データ,出力データの場所,レジスタ非破壊指定 等 フローチャートの活用 フローチャート → フローの一列変形 → ループの構成吟味 → 入出力データや一時データを表す変数とGR等との対応決定 → コーディング → デバッグ ループの構成 ループ終了条件と条件分岐命令の選択 ループ回数の確認 FRのセット確認 配列のアクセス インデックスレジスタ(GR1~GR7)の使用(0~要素数-1) 「LD BUF,GRn」型 と 「LD 0,GRn」型 251
252
CASLプログラミング ポイント総括2 スタック命令の利用 入出力命令IN,OUTの正しい使用 その他
サブルーチンでのレジスタ非破壊のためのGRの退避・復元 GR0はPUSHできないがPOPは出来る データの並べ替えに利用可能 出力したいデータの並びと逆順に計算結果が求まる場合など 入出力命令IN,OUTの正しい使用 IN BUF,LEN の BUF は常に 256語 BUFの各語の下位8ビットは「文字コード」,上位8ビットは 0 その他 科目HPの「CASL-Ⅱ ノウハウ集」を参照 252
253
期末テスト ★注意: ★アドバイス: PCは,WCASL-Ⅱ,本科目ページのみ参照可. (他アプリ,他ページ参照は不正行為と見なします)
教科書他,紙の資料は全て参照可. 提出は配布した紙で 時間はチャイムまで ★アドバイス: 問題は多めかも知れません.出来るところから取り組んで下さい. 計算問題は手計算でもWCASL-Ⅱ利用でも構いません.慣れていればWCASL-Ⅱ利用の方が計算が早いと思われます. 机が狭くなるため,問題用紙は小さくしています.解答は明瞭に記載して下さい.不明瞭だと採点出来ませんので.
254
以後 2011年度は未使用
255
プロセッサと機械語 課題(2)
256
課題1 (提出ファイル名: 1学籍番号.cas) 課題2 (提出ファイル名: 2学籍番号.cas)
GR0 の値を 40倍して GR1 に返すサブルーチンSUBFOTYを作成せよ.なお,GR1以外のGRの内容は破壊しない事. (40倍してもオーバフローしないことを前提として良い) 課題2 (提出ファイル名: 2学籍番号.cas) DAT番地から連続する5語(DC 3,4,5,6,7)の内容をそれぞれ SUBFOTY により40倍してRSLT番地から連続する5語に格納するプログラム FOTYS をループを用いて作成せよ. ヒント: SUBFOTYを必要回数呼び出す 課題3 (提出ファイル名: 3学籍番号.cas) IN BUF,LEN 命令により,文字コードを読み込み,これらの文字コードの内,数字を表す文字(0~9)の個数を数えて RSLT番地に格納するプログラム NUMNUM を作成せよ. ヒント: IN命令で読み込まれた文字コードを1つずつ数字であるかどうかをチェックしていく.ループ回数は LEN番地の内容. 数字は #0030~#0039 の範囲なので,#0030などの数と比較し,個数カウンタを+1するかどうかを判断する.数字でない場合は「個数カウンタを+1」する部分を飛び越すようにすると分かり易いプログラムになる.
257
CASLプログラミング 課題 SUBFOTY ... GR0 の値を 40倍して GR1 に返すサブルーチンSUBFOTYを作成せよ.なお,GR1以外のGRの内容は破壊しない事. (40倍してもオーバフローしないことを前提として良い) 解答例 SUBFOTY START ; GR0の値を40倍して,GR1に返す LD GR1,GR0 ; GR0 のコピー SLA GR0, ; 元の GR0 の32倍 SLA GR1, ; 元の GR0 の8倍 ADDA GR1,GR0 ; 元の GR0 の40倍 SRA GR0, ; 元の GR0 に戻す RET END ポイント ... GR0 は PUSH命令やRPUSH命令ではスタック退避できない. 他のGRにコピーし,それを退避・復元して GR0に戻すようにしても良い.
258
アセンブリ言語CASLⅡ 課題 FOTYS ... DAT番地から連続する5語(DC 3,4,5,6,7)の内容をそれぞれ SUBFOTY により40倍してRSLT番地から連続する5語に,そして,それらの合計をSUM番地に格納するプログラム FOTYS を作成せよ. 解答例 FOTYS START XOR GR2,GR2 ; 0 → GR2 (ループカウンタ・インデックスレジスタ兼用) LOOP LD GR0,DAT,GR2 ; < e = DAT+<GR2> >→GR0 CALL SUBFOTY ; <GR0>×40→GR1 ST GR1,RSLT,GR2 ; <GR1>→ e = RSLT+<GR2> LAD GR2,1,GR ; <GR2>+1→GR2 CPL GR2,= ; JMI LOOP ; if <GR2> < 5 goto LOOP RET DAT DC ,4,5,6, ; 5語分 RSLT DS ; 20倍した値の格納場所 END ポイント1 ... GR0 は SUBFOTY の入力引数,GR1 は出力引数であるので,これら以外のレジスタを使用する. ポイント2 ... ループカウントと DAT および RSLT のインデックスレジスタは兼用できる.
259
CASLプログラミング 課題 NUMNUM ... IN BUF,LEN 命令により,文字コードを読み込み,これらの文字コードの内,数字を表す文字(0~9)の個数を数えて RSLT番地に格納するプログラム NUMNUM を作成せよ. 解答例 NUMNUM START ; IN命令で読み込んだ文字の内,数字の個数を数える IN BUF,LEN XOR GR0,GR ; 0 → GR0 (S:数字の個数集計用) XOR GR1,GR ; 0 → GR1 (i:ループカウンタ&インデックシング) CPA GR1,LEN ; i =文字数 ? JZE LAST ; 文字数=0 の場合も有り得る LOOP LD GR2,BUF,GR1 ; 1文字取り出し SUBA GR2,=# ; 文字コード-#0030 JMI SKIP ; V < 0 ならスキップ CPA GR2,=9 JPL SKIP ; V > 9 ならスキップ ADDA GR0,= ; S+1→S SKIP LAD GR1,1,GR ; ループカウンタを+1 CPA GR1,LEN ; i =文字数 ? JNZ LOOP ; if ループカウンタ≠文字数 goto LOOP LAST ST GR0,RSLT ; 結果の格納 RET RSLT DS ; 個数の格納場所 LEN DS ; 文字数格納場所 BUF DS ; 入出力バッファ END
260
プロセッサと機械語 2年次前期 (第12回+期末試験)
プロセッサと機械語 2年次前期 (第12回+期末試験) 中島 克人
261
CASLプログラミング (教科書 p.38) 例題 DIV2 ... M番地の内容をN番地の内容で割算し,商をQ番地に,
余りをR番地に格納せよ.ただし,<M>≧0,<N>>0 とする. 設計2: <M>=R を 32ビットに拡張し,上位16ビットから <N>=n が引けるかどうかを確かめ,引ければ商を1に,引けなければ0にする.次に,RとQを左1ビットシフトし,新しい上位16ビットをテストする.これを16回繰り返す. - 初期値:被除数 商(下位) 余り(上位) 引けた場合:商 1セット 16ビット 16 ビット 除数 左シフト レジスタ R: n R Start: 被除数を レジスタR にセット 除数を レジスタ n にセット Rを1ビット左シフト Rの左半分から n を引く Rの最下位に 1 を加える Rの左半分>n 桁数回 終了? End YES NO R の右半分が 商 Q
262
CASLプログラミング (教科書 p.38~39) 例題 DIV2 ... M番地の内容をN番地の内容で割算し,商をQ番地に,
余りをR番地に格納せよ.ただし,<M>≧0,<N>>0 とする. DIV2 START LAD GR3, ; 16 →ループカウンタ XOR GR1,GR ; 0 →被除数R の上位16ビット LD GR2,M ; <M>→被除数R の下位 (最後は商Qが入る) D SLL GR1, ; GR1の最下位ビット(ビット0)を空ける SLL GR2, ; GR2の最上位ビットを OF にセット JOV D ; OF=1 なら D2 へ JUMP D3 D LAD GR1,1,GR1 ; OF=1 だったので,1加算 D CPA GR1,N ; 被除数R の上位16ビット>除数n ? JMI D4 SUBA GR1,N ; R-除数n → R LAD GR2,1,GR2 ; 商を1増やす(GR2の最下位桁は空いている) D SUBA GR3,= ; ループカウンタを1減らす JNZ D1 ST GR2,Q ; 商の格納 ST GR1,R ; 剰余の格納 RET M DS ; 被除数 N DS ; 除数, Q DS ; 商 R DS ; 剰余 END
263
プロセッサと機械語 まとめ
264
2011年度 終わり
265
期末試験,宿題,成績評価について 質問受付について 期末試験 成績評価
第12回(2010年7月14日2限) に期末試験を行います. 場所は 7X01 で,形式も過去2回の課題と同じ方式です. (定期試験期間中に別途試験はありません) 成績評価 (第1回課題+第2回課題) : 期末試験= 1 : 1 で評価予定 (ただし、期末試験の成績が良ければそれを重視予定) 出席状況を加味します(遅刻は半分程度加味) 質問受付について 明日7月8日(木)5限(16:30~18:00)に副手北島君が質問コーナーを開設してくれます. 場所: 1010室(11号館10階) 希望者は本講義後,副手に予告申し出して下さい.
266
問題1 (提出ファイル名: 1学籍番号.txt (各問の解答を改行で区切って入れよ))
次の文章の( )の中に適当な数字を入れよ.(各5点) 16進数 #0035 は,10進数では ( ) である. あなたの学籍番号の下位3桁の数字は4桁の16進数で表すと #( )である. 4桁の16進数の減算 #010C-#00B8 の結果は4桁の16進数の #( ) である. 2の補数表現の6桁2進数減算 - は 6桁2進数 ( )2 である. 16進数 #01B5 の各ビットの 0と1を反転させた数は 16進数の #( ) である. 問題2 (提出ファイル名: 2学籍番号SUBT.cas, 2学籍番号MAINT.cas)(25点) 入力値を10倍するサブルーチンSUBTを作成し,これを用いて10のn乗を求め,RES番地に格納するプログラム MAINTも作成せよ.(nはEXP番地の内容とする) 例: n=2→100 を格納,n=4→10,000 を格納,ヒント:SUBFOTY等を参考に 問題3 (提出ファイル名: 3学籍番号.cas)(25点) IN命令で読み込んだ文字列を逆順にしてOUT命令で出力するプログラム REVSTR を作成せよ. 例: 入力文字「1234」→出力文字「4321」,ヒント:スタックを使うと良い 問題4 (提出ファイル名: 4学籍番号.cas)(25点) IN命令により,文字列を読み込み,これらの文字コードの内,数字を表す文字だけを,その値に変換して合計し,RSLT番地に格納するプログラム NTOTAL を作成せよ. ヒント: NUMNUMを参考に
267
問題1 解答 53 ???? 0054 FE4A 次の文章の( )の中に適当な数字を入れよ。(各5点)
次の文章の( )の中に適当な数字を入れよ。(各5点) 16進数 #0035 は、10進数では ( ) である. あなたの学籍番号の下位3桁の数字は4桁の16進数で表すと #( )である. 4桁の16進数の減算 #010C-#00B8 の結果は4桁の16進数の #( ) である. 2の補数表現の6桁2進数減算 - は 6桁2進数 ( )2 である. 16進数 #01B5 の各ビットの 0と1を反転させた数は 16進数の #( ) である. 53 ???? 0054 111100 FE4A
268
問題2 解答例 入力値を10倍するサブルーチンSUBTを作成し,これを用いて10のn乗を求め,RES番地に格納するプログラム MAINT も作成せよ.(nはEXP番地の内容とする) SUBT START ; GR0の値を10倍して,GR1に返す LD GR1,GR0 ; GR0 のコピー SLA GR0, ; 元の GR0 の8倍 SLA GR1, ; 元の GR0 の2倍 ADDA GR1,GR0 ; 元の GR0 の8倍 SRA GR0, ; 元の GR0 に戻す RET END MAINT START LAD GR1, ; 1 → GR0 (初期値 10^0) LD GR2,EXP ; べき乗数(ループカウンタ) JZE LAST LOOP LD GR0,GR ; <GR1> →GR0 CALL SUBTEN ; <GR0>×10→GR1 SUBL GR2,= ; <GR2>-1→GR2 JNZ LOOP ; if <GR2> ≧ 0 goto LOOP LAST ST GR1,RES ; 結果格納 RET EXP DC ; 10のべき乗数 RES DS ; 20倍した値の格納場所 END
269
問題3 解答例 IN命令で読み込んだ文字列を逆順にしてOUT命令で出力するプログラム REVSTR を作成せよ. REVSTR START
IN BUF,LEN LAD GR1, ; ループカウンタ・インデックスの初期化 CPL GR1,LEN ; ループカウンタi と文字数を比較 JZE LAST ; 文字数=0 ならば LASTに LOOP1 LD GR5,BUF,GR1 ; 次と2つの命令で バッファの内容をPUSH PUSH 0,GR ; LAD GR1,1,GR1 ; ループカウンタi のインクリメント JNZ LOOP ; i>0 ならば LOOP1に戻り繰り返し LAD GR1, ; ループカウンタ・インデックス LOOP2 POP GR ; POP ST GR5,BUF,GR1 ; バッファに格納 LAD GR1,1,GR1 ; アドレスの加算 e+1→e JNZ LOOP ; i>0 ならば LOOP2に戻り繰り返し OUT BUF,LEN LAST RET LEN DS ; 文字数格納場所 BUF DS ; 入出力バッファ END
270
問題4 解答例 IN命令により,文字列を読み込み,これらの文字コードの内,数字を表す文字だけを,その値に変換して合計し,RSLT番地に格納するプログラム NTOTAL を作成せよ. NTOTAL START ; IN命令で読み込んだ文字の内,数字だけを合計する IN BUF,LEN XOR GR0,GR ; 0 → GR0 (S:2進数集計用) XOR GR1,GR ; 0 → GR1 (i:ループカウンタ&インデックシング) CPA GR1,LEN ; i =文字数 ? JZE LAST ; 文字数=0の場合も有り得る LOOP LD GR2,BUF,GR1 ; 1文字取り出し SUBA GR2,=# ; 文字コード-#0030 JMI SKIP ; V < 0 なら合計をスキップ CPA GR2,=9 JPL SKIP ; V > 9 なら合計をスキップ ADDA GR0,GR ; S+V→S SKIP LAD GR1,1,GR ; ループカウンタを+1 CPA GR1,LEN ; i =文字数 ? JNZ LOOP ; if ループカウンタ≠文字数 goto LOOP LAST ST GR0,RSLT ; 結果の格納 RET RSLT DS ; 合計の格納場所 LEN DS ; 文字数格納場所 BUF DS ; 入出力バッファ END
271
問題X (提出ファイル名: 1学籍番号.cas)
IN命令で数字文字(0~9)を何桁か読み込み,その中で最小値を求めて RSLT番地に格納するプログラム MIN を作成せよ. 例: 入力「1234」→1 を格納,入力「292」→2 を格納,ヒント:入力は文字コード IN命令,LOOP, 最小値の求め方 n語の領域の中に値がkに等しい語が幾つあるか、数える。 LOOPとLOOP内分岐
272
問題X 解答例 IN命令で数字文字(0~9)を何桁か読み込み,その中で最小値を求めて RSLT番地に格納するプログラム MIN を作成せよ.
MIN START ; IN命令で読み込んだ数字の最大値を求める IN BUF,LEN LAD GR0,=#003A ; #003A → GR0 (最小値用) XOR GR1,GR ; 0 → GR1 (i:ループカウンタ&インデックシング) CPA GR1,LEN ; i =文字数 ? JZE LAST ; 文字数=0の場合も有り得る LOOP LD GR2,BUF,GR1 ; 1文字取り出し CPA GR2,GR ; 現在の最小値と比較 JPL SKIP ; 大きければ入れ替えをスキップ LD GR0,GR ; 最小値の入れ替え SKIP LAD GR1,1,GR ; ループカウンタを+1 CPA GR1,LEN ; i =文字数 ? JNZ LOOP ; if ループカウンタ≠文字数 goto LOOP LAST SUBL GR0,=# ; 文字コードから数字に変換 ST GR0,RSLT ; 結果の格納 RET RSLT DS ; 合計の格納場所 LEN DS ; 文字数格納場所 BUF DS ; 入出力バッファ END
273
CASLプログラミング 演習1 ... M番地の内容(被除数)が 4100,N番地の内容(除数)が 128の時,DIV1では何命令で実行が終了するか? DIV2ではどうか? 回答1 ... 省略 演習2 ... DIV2において,上半分(GR1)に 1 が入ってくるまでの間は,1ビット(1桁)当り何命令のループか? 回答 命令 演習3 ... 被除数の値が小さい時,DIV2 をもっと高速にする方法は無いか? 回答3 ... 「前ゼロ」の数を数えて,その数だけ一度にシフトする 演習 ビット被除数の「前ゼロ」の数を数えたい.そこで,... GR2 の「前ゼロ」の数を GR3 に返すサブルーチン PRIENC を作成せよ.なお,GR3以外のGRの内容は破壊しない事. PRIENC START PUSH 0,GR ; GR2退避 XOR GR3,GR ; 0 → 前ゼロカウンタ D SLL GR2, ; GR2の最上位ビットを OF にセット JOV PRE ; OF=1 なら終了 LAD GR3,1,GR3 ; 前ゼロカウンタを1増やす CPA GR3,= ; 前ゼロカウンタ>16 ? JMI D1 PRE POP GR ; GR2復元 RET END
274
CASLプログラミング 演習5 ... PRIENCのループ部分を5命令から4命令にせよ(名称 PRIEND).
(ヒント:前ゼロカウンタに -16 のバイアスをかけて,0で終了判定する.) PRIEND START PUSH 0,GR ; GR2退避 LD GR3,= ; -16 → 前ゼロカウンタ D SLL GR2, ; GR2の最上位ビットを OF にセット JOV PRE ; OF=1 なら終了 ADDA GR3,= ; 前ゼロカウンタを1増やす JNZ D ; GR3=0なら終了 PRE LAD GR3,16,GR3 ; -16のバイアスを戻す POP GR ; GR2復元 RET END
275
CASLプログラミング 方法1 または 方法2 による フローチャートを作成せよ (教科書 p.46)
例題 PUTHEX ... N番地の値を16進数の数字に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. 解説: N番地の上位4ビットずつ切り出して,その16進の値が0~9ならば #0030~#0039,A~Fなら #0041~#0046 に変換しつつ,BUF番地から連続した4語に格納する.そして,LEN番地に 4 を格納した後に,OUT命令を実行する. 例:N番地に16進数で #081A という値が入っている場合,BUF番地から連続した4語に #0030, #0038, #0031, #0041 を格納する. 値から文字への変換方法 方法1:16進1桁の値が0~9ならば #0030 を加え,A~Fなら #0041-10,即ち,#0037 を加える 方法2:予め #0030~#0039,#0041~#0046 なる表を DC しておき,16進1桁の値 0~9,A~F でインデックシングして検索する 方法1 または 方法2 による フローチャートを作成せよ
276
CASLプログラミング (教科書 p.46) 例題 PUTHEX ... N番地の値を16進数の数字に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. 方法1: 16進1桁の値が0~9ならば #0030 を加え, A~Fなら #0041-10,即ち,#0037 を加える PUTHEX RET v+#0030→c v>10 ? <N>→n SRL(n,s)→v YES NO BUF→p 12→s v+#0037→c c→<p> p+1→p s-4→s s<0 ? RET v+#0030→c v>10 ? <N>→n SRL(n,s)→v YES NO v+#0007→v c→<p> p+1→p s-4→s s<0 ? 1列に並べる
277
CASLプログラミング (教科書 p.46) 例題 PUTHEX ... N番地の値を16進数の数字に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. 8 A 1 3 例: PUTHEX START LAD GR3,BUF ; 16進数字格納位置 LAD GR1, ; シフト数 PH LD GR2,N ; 変換すべき数の読み込み SRL GR2,0,GR ; 12,8,4,0ビット右シフト AND GR2,=#000F ; 下位4ビット以外を消す CPA GR2,= ; 16進数が10より大きいか? JMI PH2 LAD GR2,#0007,GR2 ; 英字に変換するための補正 PH LAD GR2,#0030,GR2 ; 文字コードにする ST GR2,0,GR3 LAD GR3,1,GR ; 格納位置を進める SUBA GR1,= ; シフト数-4 JPL PH ; シフト数が正ならもう一度 JZE PH ; シフト数が0ならもう一度 OUT BUF,LEN RET N DS ; 変換すべき数 LEN DC ; 文字数 BUF DS ; 16進文字列 END 8 SRL で 12ビットシフトし, 下位4ビット以外を消す 3 8 #0030 を加算 8 A 1 3 SRL で 8ビットシフトし, 下位4ビット以外を消す 4 1 #0007 と #0030 を加算
278
CASLプログラミング (教科書 p.46) 例題 PUTHEX ... N番地の値を16進数の数字に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. 方法2: 予め #0030~#0039,#0041~#0046 なる表を DC しておき,16進1桁の値 0~9,A~F でインデックシングして検索する PUTHEX BUF→p 12→s <N>→n SRL(n,s)→v #0030~#0039,#0041~#0046 なる表は 文字列定数の定義,即ち, DC ‘ ABCDEF’ で定義可能 table(v)→c c→<p> p+1→p s-4→s s<0 ? NO YES RET
279
CASLプログラミング (教科書 p.46) 例題 PUTHEX ... N番地の値を16進数の数字に直して BUF番地から始まる文字用バッファ領域に格納し,OUT命令で表示せよ. PUTHEX2 START LAD GR3,BUF ; 16進数字格納位置 LAD GR1, ; シフト数 PH LD GR2,N ; 変換すべき数の読み込み SRL GR2,0,GR ; 12,8,4,0ビット右シフト AND GR2,=#000F ; 下位4ビット以外を消す LD GR2,HXCHR,GR2 ; 文字コードにする ST GR2,0,GR3 LAD GR3,1,GR ; 格納位置を進める SUBA GR1,= ; シフト数-4 JPL PH ; シフト数が正ならもう一度 JZE PH ; シフト数が0ならもう一度 OUT BUF,LEN RET HXCHR DC ‘ ABCDEF’ N DS ; 変換すべき数 LEN DC ; 文字数 BUF DS ; 16進文字列 END
280
プロセッサと機械語 応用問題 ビット演算 値から文字コードへの変換
281
CASLプログラミング 課題 BCDBIN ... ラベルDAT番地の bit 15~12, bit 11~8, bit 7~4, bit 3~0 に非負の10進4桁の各桁の値が格納されている(BCD:Binary Coded Decimal).各桁の値は 0~9 である事が保証されている. このDAT番地の10進4桁を 2進数に変換し,BIN番地に格納するプログラム BCDBIN を課題1の SUBTEN を呼び出す(活用する)形で作成せよ. BCDBIN START ; DAT番地の BDC を2進数に変換する XOR GR0,GR ; 変換後の数(初期化) LAD GR2, ; シフト数 LOOP LD GR3,DAT ; 変換すべき BCD の読み込み SRL GR3,0,GR ; 12,8,4,0ビット右シフト AND GR3,=#000F ; 下位4ビット以外を消す CALL SUBTEN ; GR0 を 10倍して GR1 に LD GR0,GR ; GR1 → GR0 ADDA GR0,GR3 SUBA GR2,= ; シフト数-4 JPL LOOP ; シフト数が正ならもう一度 JZE LOOP ; シフト数が0ならもう一度 ST GR0,BIN RET DAT DS ; 変換すべき BCD BIN DS ; 変換結果 END 4 3 2 1 DAT GR0 4 3 2 1 GR3 12ビット 右シフト GR3 1 GR1 GR0の10倍 GR0 1 GR3 2 GR1 GR0の10倍 GR0 1 8ビット 右シフト 4 3
282
CASLプログラミング (教科書 p.50) 課題 BREVAO ... BIT番地に格納された1語の内容を左右反転(ビット反転)させてBIT番地に戻す. 元データ YES BREVAO RET r→<BIT> n=0 ? <BIT>→m 0→r 16→n NO m and #0001→b SLL(r,1)→r r or b→r SRL(m,1)→m n-1→n ・ ・ ・ ・ 結果 データ ポイントおよび設計: 1ビットずつ,ビット数分(16回)の処理で 隅のビットを取り出し後,1ビットシフト 結果データをどう貯めて行くかがポイント <BIT>→mの最下位ビットを取り出し,結果rの最下位にセットする.次にmを右1ビットシフトし,rを左1ビットシフトする.これを16回繰り返す.
283
CASLプログラミング 1011010011010010 0000010110100110 XXXXXXXXXXXXXXX0
(教科書 p.50) 課題 BREVAO ... BIT番地に格納された1語の内容を左右反転(ビット反転)させてBIT番地に戻す. 元データ XXXXXXXXXXXXXXX0 結果 データ XXXXXXXXXX001001 元データ XXXXXXXXXXXX0100 XXXXXXXXXXXXXXX0 結果 データ 元データ XXXXXXXXXXXXXX01 結果 データ XXXXXXXXXXXXX010
284
CASLプログラミング (教科書 p.50) 課題 BREVAO ... BIT番地に格納された1語の内容を左右反転(ビット反転)させてBIT番地に戻す. BREVAO START ; 1語の内容を左右逆転(ビット反転)する LD GR0,BIT LAD GR3, ; 繰り返し数 ; 結果を蓄えるGR1の初期化が不要なのは何故か? LOOP LD GR7,GR0 AND GR7,=#0001 ; GR0の右端の1ビットを取り出す SLL GR1, ; GR1に逆転を作る OR GR1,GR7 SRL GR0,1 SUBA GR3,=1 JNZ LOOP ; ループカウンタが0になるまで繰り返し ST GR1,BIT ; 結果の格納 RET BIT DS ; 反転させるべきデータ END
285
プロセッサの回路動作 WCASL-Ⅱ (COMETシミュレータ) 復習 IR: Instruction Register
MAR: Memory Address Register PR: Program Register MDR: Memory Data Register SP: Stack Pointer 制御装置 演算装置 主記憶 単なる説明 10進数 50 = 32 + 16 + 2 2進数 100000 +10000 +10 =110010 16進数 200 = 128 + 64 + 8 +1000 = = C8
286
プロセッサの回路動作イメージ プロセッサは同期回路で構成される 同期回路 $ 組合せ回路とレジスタ(メモリ)からなる
クロック(Clk)ごとにレジスタの内容を同時に更新する Clk 回 レジスタ→組合せ回路→レジスタの最長遅延時間(クリティカルパス)でクロック間隔=動作周波数が決まる 組合せ回路中を信号伝播 レジスタに記憶
287
プロセッサの回路動作イメージ CPU 1つの機械命令は複数のクロックで実行が完了する 機械命令の取り出し(フェッチ)
OP operand-1 operand-n ● CPU 機械命令の取り出し(フェッチ) 命令の解読(解釈/デコード) (オペランド準備) 演算実行 結果格納 制御装置 命令 デコード PR IR 主記憶 機械語 演算装置 MDR 汎用 レジスタ ALU IR: Instruction Register PR: Program Register MDR: Memory Data Register ALU: Arithmetic & Logical Unit
288
プロセッサの回路動作例 CPU LD GR1,DAT,GR2 ① 命令フェッチ(IF) ② 命令デコードと ① adr,$2の取出し(ID)
命令制御 演算ユニット MDR PR IR 命令 デコード 汎用 レジスタ MAR ALU $1 adr $2 ① 命令フェッチ(IF) ② ② 命令デコードと adr,$2の取出し(ID) 主記憶 ① adr 機械語 ③ アドレス計算のための 演算 adr+($2)(EX) ④ ⑤ $1 $2 ④ 主記憶読出し(MA) ③ アドレス計算をALUで行う場合 ⑤ $1に格納(WB)
289
スループット(処理速度)=0.2命令/clock cycle
命令パイプライン処理 - 概念 - 命令の実行過程は複数のステージに分割される IF、ID、EX、MA、WB cc: clock cycle ( 1GHzのCPUのccは10-9sec) 1cc 2cc 3cc 4cc 5cc 時間 命令 i ID EX MA WB IF 同時処理する 命令i+1 ID EX MA WB IF スループット(処理速度)=0.2命令/clock cycle 異なる命令の異なるステージを同時に処理することで、命令実行のスループットを向上
290
命令パイプライン処理 -性能向上- スループット=1.0命令/cc,即ち 5倍に! 理想的な状態
時間 1cc 2cc 3cc 4cc 5cc 命令 i ID EX MA WB IF 命令i+1 ID EX MA WB IF 命令i+2 ID EX MA WB IF 命令i+3 ID EX MA WB IF 命令i+4 ID EX MA WB IF 命令i+5 ID EX MA WB IF スループット=1.0命令/cc,即ち 5倍に! 詳しくは,2年後後期「コンピュータアーキテクチャ」にて
291
CASLプログラミング 課題 IDOUT ...自分の学籍番号を 09FI999 などのように出力するCASLプログラムを作成せよ.
IDOUT START ; 学籍番号を出力する LAD GR1, ; インデックス LOOP LD GR0,IDNUM,GR1 ; 1文字読み込み ST GR0,BUF,GR ; BUFに書き込み LAD GR1,1,GR ; インデックスを+1 CPA GR1,= ; 0~6 まで JMI LOOP ; 繰り返し OUT BUF,L ; 出力 RET IDNUM DC ’09FI999’ L DC ; 出力文字数 BUF DS ; 出力バッファ END IDOUT START ; 学籍番号を出力する OUT BUF,L ; 出力 RET L DC ; 出力文字数 BUF DC ’09FI999’ ; 出力バッファ(最初の7文字) BUF1 DS ; 出力バッファ(残り249文字) END
292
CASLプログラミング 課題 FBREV ... GR0 の内容を4ビット単位で(例えば #0123 を #3210 に)並び替えてGR1に格納するサブルーチンプログラムFBREVをループを用いて作成せよ.なお,GR1以外のGRの内容は破壊しない事. FBREV START ; 4ビットずつ並び替えるサブルーチン PUSH 0,GR2 PUSH 0,GR3 XOR GR1,GR ; 並び替え後の値(初期化) LAD GR2, ; シフト数 LOOP LD GR3,GR ; 並び替えデータのコピー SRL GR3,0,GR ; 0,4,8,12ビット右シフト AND GR3,=#000F ; 下位4ビット以外を消す OR GR1,GR3 ADDA GR2,= ; シフト数+4 CPA GR2,=16 JZE LAST ; シフト数が16なら終了 SLL GR1, ; 並び替え後の値を左に JUMP LOOP ; 繰り返し LAST POP GR3 POP GR2 RET END
293
CASLプログラミング 課題 BREVOF ... 教科書p.50の「BIT番地に格納された1語の内容を左右反転(ビット反転)させてBIT番地に戻す」例題プログラム BREVERSE では AND命令を用いてビットの取り出しを行っている.これを,OF(Overflow Flag)を用いたプログラム BREVOF に改良せよ. BREVOF START ; 1語の内容を,OF を用いて左右逆転(ビット反転)する LD GR0,BIT XOR GR2,GR2 ; 結果格納用(初期化) LAD GR1, ; 繰り返し数 SHIFT SLL GR2, ; 結果を1ビット左シフト SRL GR0, ; 1ビット右シフトし,最下位bit → OF JOV BSET JUMP NEXT BSET OR GR2,=1 NEXT SUBA GR1,= ; ループカウンタを-1 JNZ SHIFT ; ループカウンタが0になるまで繰り返し LAST ST GR2,BIT ; 結果の格納 RET BIT DS ; 反転させるべきデータ END
294
プロセッサと機械語 課題(2) 解答例
295
課題1 (提出ファイル名: 1学籍番号.cas) 課題2 (提出ファイル名: 2学籍番号.cas)
GR0 の値を 40倍して GR1 に返すサブルーチンSUBFOTYを作成せよ.なお,GR1以外のGRの内容は破壊しない事. (40倍してもオーバフローしないことを前提として良い) 課題2 (提出ファイル名: 2学籍番号.cas) DAT番地から連続する5語(DC 3,4,5,6,7)の内容をそれぞれ SUBFOTY により40倍してRSLT番地から連続する5語に格納するプログラム FOTYS を作成せよ. ヒント: SUBFOTYを必要回数呼び出す 課題3 (提出ファイル名: 3学籍番号.cas) IN BUF,LEN 命令により,文字コードを読み込み,これらの文字コードの内,数字を表す文字(0~9)の個数を数えて RSLT番地に格納するプログラム NUMNUM を作成せよ. ヒント: IN命令で読み込まれる数字は #0030~#0039 の範囲である
296
プロセッサと機械語 乗算
297
CASLプログラミング (教科書 p.35) 例題 MULT ... M番地の内容とN番地の内容の積を求め,P番地に格納せよ.ただし,N番地の内容=<N>≧0 とし,また,積は1語に納まるものとする. 設計1: <M>=m を <N>=n 回だけ加算する. P+m→P n-1→n YES MULT RET 答:P n=0 ? 0→P <M>→m <N>→n NO YES MULT RET 答:P n=0 ? 0→P <M>→m <N>→n NO NO P+m→P n-1→n n=0 ? 1列に並べる YES
298
CASLプログラミング (教科書 p.37) 例題 MULT2 ... M番地の内容とN番地の内容の積を求め,P番地に格納せよ.ただし,N番地の内容=<N>≧0 とし,また,積は1語に納まるものとする. 疑問: 10進数の乗算 m×n を,「mをn回だけ加算」で計算するだろうか? 乗数nの各桁と被乗数mの掛け算を九九を使って行い,それらを桁をずらして加算する 積 × step 1 step 2 step 3 step 4 被乗数 乗数 正整数での例 2進数の「九九」: 0×0=0,1×0=0 1×0=0,1×1=1 2進数乗算(筆算方式)の原理 被乗数をシフトしながら加算する 乗数の最下位ビットから乗算する ただし、乗数の1の立っているビット位置だけ加算する (被乗数および乗数の桁数を nビットとすると積は 2nビット)
299
CASLプログラミング (教科書 p.37) 例題 MULT2 ... M番地の内容とN番地の内容の積を求め,P番地に格納せよ.ただし,N番地の内容=<N>≧0 とし,また,積は1語に納まるものとする. 設計2: m×n=n14×(m×214)+n13×(m×213)+ ・・・ + n0×(m×20) YES MULT2 RET 答:P n=0 ? 0→P <M>→m <N>→n SRL(n,1)→n OF=1 ? NO P+m→P SLL(m,1)→m YES MULT2 RET 答:P n=0 ? 0→P <M>→m <N>→n NO SRL(n,1)→n OF=1 ? NO YES P+m→P 1列に並べる SLL(m,1)→m
300
CASLプログラミング (教科書 p.37) 例題 MULT2 ... M番地の内容とN番地の内容の積を求め,P番地に格納せよ.ただし,N番地の内容=<N>≧0 とし,また,積は1語に納まるものとする. MULT2 START XOR GR1,GR ; 0 → GR1 (P:積) LD GR0,M ; 被乗数 m → GR0 LD GR2,N ; 乗数 n → GR2 JZE M ; 乗数 n = 0 ? M SRL GR2, ; 乗数 n を2で割る JOV M ; 最下位ビットが1だったか? JUMP M3 M ADDA GR1,GR ; P+被乗数 m → P M SLA GR0, ; 被乗数 m を2倍 OR GR2,GR ; GR2 の 0 チェック JNZ M ; n=0 なら終了 M ST GR1,P ; 積の格納 RET M DS ; 被乗数 N DS ; 乗数 P DS ; 積 END
301
プロセッサと機械語 除算
302
CASLプログラミング (教科書 p.38) 例題 DIV1 ... M番地の内容をN番地の内容で割算し,商をQ番地に,
余りをR番地に格納せよ.ただし,<M>≧0,<N>>0 とする. 設計1: <M>=R から <N>=n を引けるだけ引算し,その回数を数える. Q+1→Q R-n→R YES DIV1 RET 答:Q,R R<n ? 0→Q <M>→R <N>→n NO YES DIV1 RET 答:Q,R R<n ? 0→Q <M>→R <N>→n NO NO Q+1→Q R-n→R R<n ? 1列に並べる YES
303
CASLプログラミング (教科書 p.38) 例題 DIV1 ... M番地の内容をN番地の内容で割算し,商をQ番地に,
余りをR番地に格納せよ.ただし,<M>≧0,<N>>0 とする. DIV START XOR GR1,GR ; 0 → GR1 (Q:商) LD GR0,M ; 被除数 R → GR0 D CPA GR0,N ; JMI D ; R < 除数 ? LAD GR1,1,GR1 ; Q+1 → Q SUBA GR0,N ; R-除数 → R JUMP D1 D ST GR1,Q ; 商の格納 ST GR0,R ; 剰余の格納 RET M DS ; 被除数 N DS ; 除数 Q DS ; 商 R DS ; 剰余 END
304
CASLプログラミング 演習 DIVSUB ... GR1 の内容(≧0)を GR3 の内容(>0)で割算し,
DIVSUB START XOR GR2,GR ; 0 → GR2 (Q:商) D CPA GR1,GR ; JMI D ; R < 除数 ? LAD GR2,1,GR2 ; Q+1 → Q SUBA GR1,GR ; R-除数 → R JUMP D1 D RET END 演習 DIVTEN ... GR1 の内容(≧0)を 10 で割算し,商を GR2 に,余りを GR1 に戻すサブルーチンを作成せよ. なお,GR2以外のGRの内容は破壊しない事.
305
プロセッサと機械語 浮動小数点数
306
2進数整数の表現可能範囲 2N-1-1 -2N-1 overflow N ビット での表現可能範囲 2の補数表現時のNビット整数の表現範囲と
overflow N ビット での表現可能範囲 32ビット計算機(N=32)でも,整数は -4G~+4G 2010年度国家予算(一般会計) 総額92兆円 = 92,000G円 が表現できない!
307
データの計算機内部表現 → 浮動小数点数 (=実数表現) N K 少ないビット数で大きな数を表現したい
例: 8ビット符号なし整数 → 0 ~ 255 では不十分なとき → 浮動小数点数 (=実数表現) N K 左4ビットをN,右4ビットをK として N × 2 K → 0 ~ 15×2 15 (正確に)表現出来ない数がある 例:31 (10進数) = (2進数) 即ち,精度を犠牲にしてレンジを広げた
308
浮動小数点数 ×2 ×2 K N K S N → 0 ~ 15×215 → -7×215 ~ 7×215
COMET Ⅱには無いが,大抵のプロセッサには有る N ×2 K 指数部 仮数部 左4ビットを N,右4ビットを K として N × 2 K → 0 ~ 15×215 負数の表現は? N ×2 K 指数部 仮数部 符号 S → -7×215 ~ 7×215 ⇒ Nの左端ビットをS(符号)に
309
演習:浮動少数点数の表現範囲 ×2 ×2 K N S K ( - 4 ) N S → -4095×27 ~ +4095×27 「ゲタ」
次の形式を持つ16ビットの浮動少数点数の表現範囲は? S ×2 指数部 3 ビット 仮数部 12 ビット 符号 N K → -4095×27 ~ +4095×27 同じビット数で小数点数を表現するには? → -4095×27-4 ~ +4095×27-4 S ×2 指数部 仮数部 12 ビット 符号 N K ( - 4 ) 「ゲタ」
310
演習:浮動少数点数の表現範囲 ×2 ( - 4 ) 0000000000000001 解答: =+1×20-4 =1/16=0.0625
次の形式を持つ16ビットの浮動少数点数の値は? 符号 仮数部 12 ビット ( - 4 ) 000 指数部 ×2 「ゲタ」 解答: =+1×20-4 =1/16=0.0625 16ビットで表現すると, 指数部 仮数部 符号
311
浮動少数点数の表現範囲 同形式の下で,下記は全て同じ値である 指数部 仮数部 符号 仮数部を2倍し, 指数部を-1する 指数部 仮数部 符号 仮数部を32倍し, 指数部を-5する 指数部 仮数部 符号 仮数部の最上位の 1を左端に寄せる事を 正規化という
312
浮動小数点数の表現範囲 (IEEE754準拠浮動小数点数)
単精度(32ビット) 値=(-1)S×(1+仮数部)×2(指数部-ゲタ) (ゲタ=127→指数値=-127~+128) 倍精度(64ビット) (ゲタ=1023→指数値=-1023~+1024) 1 8 bits 23 bits 隠しビット S 指数部 仮数部 小数点以下 1 11 bits 52 bits S 指数部 仮数部
313
浮動小数点数の加減算 手順 (1)指数部の差に応じて仮数部を(シフトして)合せる (2)符号に応じて仮数部を加減算する
(3)結果を正規化し、仮数部を丸める (4)overflow/underflowを判定する 例: ×24 - ×23 ×24 0.1000 ×24 桁合せ 0.1000 ×23 ×24 0.0011 正規化 ×22 0.1100 overflow :指数値が指数部の最大表現範囲を超えた時 underflow :指数値が指数部の最小表現範囲を超えた時
314
期末試験実施要領 試験開始前の準備 試験要領 提出フォルダを作成して下さい メールソフトやメッセンジャー等は起動しては行けません
第12回フォルダの下 メールソフトやメッセンジャー等は起動しては行けません 試験中に発見されると不正行為と見なしますので注意して下さい 試験要領 自由席(席指定なし) 試験時間は 11:00~12:10 (途中退出は認めません) 解答は,各問題とも,提出フォルダに指定されたファイル名で (フォルダ提出に不都合があれば紙(問題用紙の解答欄)での回答も可能)
315
期末テスト ★自由席のまま, 時間は 12:10(チャイム)まで ★PCは,WCASL-Ⅱ,本科目ページのみ参照可. (他ページ参照は不正行為と見なします) ★教科書他,紙の資料は全て参照可. ★課題の提出先は下記 ★問題の置き場所: 第12回→「配布」フォルダ内の Problem-10-kimatsu.pdf または proc-ml/tempkimatsu/Problem-10-kimatsu.pdf 本日のテストの提出フォルダ \\tfs11\tdfsroot\神田キャンパス\前期\未来科学部\②(FI)情報メディア学科 \FI2プロセッサと機械語(中島克人)水2\第12回\提出\09fi??? (上記フォルダへの提出ができない人は紙で解答して貰いますので,申し出る事)
316
課題の提出方法(教材サーバへ) 教材サーバ(Nドライブ)への接続 共有フォルダへのアクセスのための認証 科目フォルダのアクセス
エクスプローラなどのアドレス部分に \\tfs11\tdfsroot を入力 認証画面に「ユーザ名」「パスワード」を入力.ただし, 「ユーザ名」 は 「term\学籍番号」 「パスワード」はメディアセンター利用時のもの 科目フォルダのアクセス \\tfs11\tdfsroot の下 \神田キャンパス\前期\未来科学部 \②(FI)情報メディア学科 \FI2プロセッサと機械語(中島克人)水2 term\09fi999 のように入力 認証画面
317
課題の提出方法(教材サーバへ) 各自の「提出」フォルダの作成と課題解答の格納 本日の提出フォルダのアクセス
科目フォルダの下に「第N回」(N=01~15)のフォルダがある 指定された「第N回」フォルダの下に「配布」と「提出」のフォルダがある 自分のフォルダを「提出」フォルダ内に作成 「提出」フォルダにある 自分のフォルダ作成.vbs を実行し,自分の学籍番号を指定することにより,自分の提出用フォルダを作成 課題解答の提出 \提出\学籍番号 の下に,次のルールに従ったファイル名にて課題解答を格納する \\tfs11\tdfsroot \鳩山キャンパス \神田キャンパス … \前期 \後期 \未来科学部 \②(FI)情報メディア学科 \FI2プロセッサと機械語(中島克人)水2 第01回 第02回 第N回 第15回 配布 提出 ★ 提出ファイル名称のルール 第n問の解答は,n学籍番号.cas 等とする 自分のフォルダ作成.vbs 09fi000 … 09fi999 このスクリプトを実行すると 自分の学籍番号を名前とする フォルダが作成される 例: 第1問解答ファイル名: 109fi999.cas 第2問解答ファイル名: 209fi999.cas 209fi999.cas 109fi999.cas 第2問解答 第1問解答
318
課題の提出方法(教材サーバへ) 各自の「提出」フォルダの作成(補足) 自分のフォルダを「提出」フォルダ内に作成
「提出」フォルダにある 自分のフォルダ作成.vbs を実行し,自分の学籍番号を指定することにより,自分の提出用フォルダを作成 ★各自の「提出」は学生自身が作成する. ★「提出」フォルダにあるスクリプト(vbs)「自分のフォルダ作成.vbs」 をダブルクリックする事により,ログイン名のフォルダを作成できる. ★手動での作成も可能だが,このスクリプトを使用する事で, 半角・全角などタイプミスが防げる.
319
本日の課題 置き場所は 直ちに開始して下さい (試験時間30分の予定) (問題を紙で欲しい人は申し出て下さい) 右記「配布」フォルダ内の
\\tfs11\tdfsroot \神田キャンパス \鳩山キャンパス … \前期 \未来科学部 \後期 \②(FI)情報メディア学科 \FI2プロセッサと機械語(中島克人)水2 第01回 第02回 第10回 第15回 配布 提出 置き場所は 右記「配布」フォルダ内の Problem-10-2.pdf または, proc-ml/testtemp/Problem-10-2.pdf 直ちに開始して下さい (試験時間30分の予定) (問題を紙で欲しい人は申し出て下さい)
320
他の問題候補 JNZ使用をJZE使用に変形. JNZ,JZEを使用しないように変形. このプログラムの出力結果は? (ループ回数の把握) ループを自分で構成. ループカウンタを逆にする. IN命令で取り込んだ文字列をOUT命令で逆順に出力するプログラム. プログラムの穴埋め問題. INを使う.OUTを使う.サブルーチンを作る. ループ内実行命令数を減らす.
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.