Copyright 守屋悦朗 2005 コンピュータの仕組み (2) ソフトウェア 3.3 アセンブラプログラミング (CASLⅡ) 情報処理技術者試験基本情報技術者試験 (http://www.jitec.jp/index.html) では 仮想コンピュータ (16ビットのワードマシン 主記憶容量 64KW)COMETⅡを定義し COMETⅡ のためのアセンブリ言語 CASLⅡを定めている COMETⅡとCASLⅡの仕様は情報処理技術者試験センターのウェブサイト http://www.jitec.jp/1_13download/hani01.pdf で公開されている ここでは このアセンブリ言語によるプログラミングを通して コンピュータの仕組みを理解する COMETⅡ のハードウェア構成 16 ビットワードマシン 演算装置 + 制御装置 アドレス 0000 16 ビット 16 ビット GR0 入力装置 0001 汎用レジスタ群 GR1 主記憶装置 64KW スタックポインタ 16 ビット 出力装置 GR7 SP プログラムレジスタ PR FFFF フラグレジスタ (FR) OF SF ZF =2 16-1 =65535 各 1 ビット
主記憶の使われ方 システム領域 SP スタックポインタ システム用 スタック用 プログラム起動時に OS によって確 保される (SP が決められる ) プログラム用 メインルーチン プログラム領域 命令コードの列定数 変数用領域サブルーチン命令コードの列 先頭番地は リンク時に OS によって決められる 定数 変数用領域 空き領域 汎用レジスタ (general-purpose register) COMETⅡでは 以下に述べる機械語命令が使える演算 ( 加減算 論理演算 比較演算など ) しか実行することができない 演算は汎用レジスタ (GR0~GR7) を使って行われる 0 番レジスタ (GR0) 以外のレジスタは インデックスレジスタとしても使うことができる フラグレジスタ (flag register) 機械語命令 ( 演算 ) の実行結果によって フラグレジスタの 3 ビットが以下のように設定 される
OF Overflow Flag 算術演算命令の実行結果が-32768(=-2 15 )~+32767(=2 15-1) に収まらなくなったとき1 それ以外のとき0 論理演算命令の実行結果が0~65535(=2 16-1) に収まらなくなったとき1 それ以外のとき0 SF Sign Flag 演算結果の符号が負 (2 15 位のビットが1) のとき1 それ以外のとき0 ZF Zero Flag 演算結果が0( 全ビットが0) のとき1 それ以外のとき0 プログラムレジスタ (program register) プログラムレジスタは 2.1 CPUの基本原理 のところで述べたアドレスレジスタと同じものである プログラムレジスタはCOMETⅡの制御部にあり 次に実行すべき機械語命令が格納されているアドレス ( 命令語の先頭番地 ) が入る スタックポインタ (stack pointer) スタック領域は サブルーティンからの戻り番地等を格納するための領域である スタックポインタは そのスタック領域の最上位のアドレスを保持している ( その値は プログラム起動時にOSによって決められる ) これについては 後述する COMETⅡ CASLⅡ で扱える数 COMETⅡ CASLⅡ で扱える数は整数 (16 ビット固定小数点数 ) だけである 符号ビット 15 ビット 先頭の 1 ビット (2 15 の位 ) は符号ビット (sign bit) として用いられる 符号ビットが 0 のときは正の整数を 1 のときは負の整数を表す 正の数の場合 残りの 15 ビットがその値の 2 進数表現である 例えば (0 000000000000101) 2 = (5) 10 (0 111111111111111) 2 = (32767) 10 = 2 15-1 負の数は 2 の補数で表される 例えば (1 111111111111111) 2 = (-1) 10
(1 111111111111011) 2 = (-5) 10 (1 000000000000000) 2 = (-32768) 10 = -2 15 よって 扱える数の範囲は -2 15 = -32768 ~ +32767 = 2 15-1 である ( 問 ) 次の数の COMETⅡ での内部表現を求めよ 1 123 2-123 3 0 COMETⅡの機械語 COMETⅡの機械語の詳細は定義されていないが 機械語命令は1 語または2 語を使って次のようにメモリ内で表される : 1 2 命令コード 汎用レジスタの番号 汎用 / インデックスレジスタの番号 8 ビット ( 第 1 語の上半語 ) 8 ビット ( 第 1 語の下半語 ) または 1 2 3 命令コード 汎用レジスタの番号 汎用 / インデックスレジスタの番号 命令の対象となるアドレス 8 ビット ( 第 1 語の上半語 ) 8 ビット ( 第 1 語の下半語 ) 16 ビット ( 第 2 語 ) 1の 命令コード はその命令の名前を 2 進数で表したものであり 3の アドレス部 にはその命令の操作対象となるデータが入っている主記憶装置のアドレスが入れられる 2の 修飾部 には 汎用レジスタの番号あるいはインデックスレジスタの番号が入る ( レジスタ (register) とは 演算に使われる少数個の高速メモリのこと ) 各命令語の構成については 上記ウェブサイトに公開されている PDF ファイル ( ファイル名 hani01.pdf) の p.30 を見よ 例えば ロード (load) 命令 LD は CASL Ⅱでは LD r,adr,x (*1) という形で書く LD は命令の名前 ( ニモニック (mnemonic) という ) である LD 命令の命令コードは 16 進数の 10(2 進数の 00010000) である rは汎用レジスタ GR0~GR7 のどれか ( 機械語内では 2 進数 0000~0111 で表す )
adr は主記憶装置内のアドレスを1 語で表す x はインデックスレジスタ (GR1~GR7 のどれか ) の番号 例えば LD GR3, ABC, GR5 (*2) という命令は ( 記号番地 ABC)+(GR5 の現在値 ) で与えられるアドレスに格納されている1 語分のデータを GR3 にロードせよ ということを表すが 例えば 記号番地 ABC のアドレスが 16 進数で 089A だとすると その機械語表現は 0001 0000 0011 0101 0000 1000 1001 1010 (*3) となる 記号番地 (symbolic address 記号名とか ラベルともいう) とは 主記憶装置内の特定のアドレスを記号で表したもののことである CASL Ⅱでは 記号番地 ( ラベル ) として 先頭が大文字の英字 2 文字目以降が英大文字または数字であるような 長さが 1~8 文字の記号列 が使われる ただし 予約語 (reserved word) である GR0~GR7 は使えない ( 問 ) 次の命令を 2 進数で表せ 記号番地 PQR の値は A098 であるとする : 1 ADDA GR3,PQR,GR0 2 AND GR3,GR4 3 JZE GR6,PQR 1 において GR3, ABC, GR5 それぞれをこの LD 命令のオペランド (operand) という (*1) において第 3 オペランド ( インデックスレジスタの指定 ) が無い場合 すなわち (*2) が LD GR3,ABC (*4) という形の場合 この命令は ( 記号番地 ABC)+(GR5 の現在値 ) で与えられるアドレスに格納されている1 語分のデータを GR3 にロードせよ ということを表す (*2) のように第 3オペランドが指定されていて +(GR5 の現在値 ) がある場合 +(GR5 の現在値 ) を行うことをインデックス修飾 (index modification) という (*4) のようにインデックス修飾がない場合 (*3) のインデックスレジスタ部は 0となり (*3) は 00010000 0011 0000 0000100010011010 (*5)
となる 上記は 2 語命令の例であるが 同じロード命令でも LD r1,r2 (*6) は 1 語で表される命令 (1 語長命令 ) で 例えば LD GR3,GR5 (*7) は レジスタ GR5 に格納されている1 語分のデータをレジスタ GR3 にロードせよ ということを意味し そのコンピュータ内部での表現は 00010100 0011 0101 (*8) である ( 命令コードが違うことに注意せよ ) 以上のことを http://www.jitec.jp/1_13download/hani01.pdf のpp.24~26, p.30では次のように表している : 第 1 語第 2 語命令 OP r/r1 x/r2 Adr 語長 機械語命令 意味 00 - - - 1 NOP 何もしない 10 2 LD r,adr[,x] r ( 実効アドレス ) 11 2 ST r,adr[,x] 実効アドレス (r) 12 2 LAD r,adr[,x] r 実効アドレス 14 1 LD r1,r2 r1 (r1) 20 2 ADDR r,adr[,x] r r+( 実効アドレス ) ( 以下略 ) r, r1, r2 は汎用レジスタ GR0~GR7 のいずれか adr はアドレス ( 記号番地 ) x はインデックスレジスタ GR1~GR7 のいずれか [ ] 内の指定は省略できる ( ) は ( ) 内のレジスタまたはアドレスに格納されている内容を表す 実効アドレスとは adr と x の内容の論理加算値またはその値が示す番地のこと は 演算結果を 左辺のレジスタまたはアドレスに格納することを表す COMETⅡ のアセンブラ言語 CASLⅡ COMETⅡ 用のアセンブラ言語である CASLⅡ の仕様は上記ウェブサイトに公開されている ( 詳細はそちらを見ること ) CASLⅡ には以下のような命令がある
機械語命令(28 種類 ) ロード ストア命令 LD, ST, LAD 算術 論理演算命令 ADDA, ADDL, SUBA, SUBL, AND, OR, XOR 比較演算命令 CPA, CPL 分岐命令 JPL, JMI, JNZ, JZE, JOV, JUMP スタック操作命令 PUSH, POP コール リターン命令 CALL, RET その他 SVC, NOP アセンブラ命令(4 種類 ) START, END, DS, DC マクロ命令(4 種類 ) IN, OUT, RPUSH, RPOP アセンブリ言語 (assembly language, アセンブラ語とかアセンブラ言語ともいう ) とは 単なる0,1の列である機械語を より人間に分かりやすく書けるようにしたものである 機械語命令は 機械語と1 対 1に対応し 命令コードの代わりに記号名 ( ニモニック ) で表す アセンブラ命令は アセンブラ (assembler, アセンブリ言語で書かれたプログラムを機械語に翻訳するプログラム ) へ指令を与える命令であり CASL Ⅱでは START ( プログラムの始まりを示す ) END ( プログラムの終わりを示す ) DS ( 領域を割り当てる ) DC ( 定数を作り出す ) の4つがある マクロ命令は あらかじめ定義された一連の命令群とオペランド ( その命令群へ渡すデータのこと ) の値によって 一定の機能を果たす擬似的な命令 ( マクロ (macro) という ) を生成する 言い換えれば ユーザが擬似的な複合命令を作るために用意されているのがマクロ命令である ただし CASL Ⅱのマクロ命令はきわめて簡単なマクロしか定義できない 例えば 入出力を行なう命令群を生成する INやOUTはそれぞれマクロ命令である
命令行の書き方 CASLⅡのプログラムは 命令行と注釈行とから成る 1つの命令は1 行で (2 行にまたがってはいけない ) 次の形式で行の先頭から書かなければならない : オペランドがある命令の場合 [ ラベル ] 空白命令コード空白オペランド [ 空白 ; コメント ] オペランドがない命令の場合 [ ラベル ] 空白命令コード [ 空白 ; コメント ] 注釈だけの場合 [ 空白 ] ; コメント オペランド (operand) とは 命令の操作対象となるもののことである ラベルは 先頭が大文字の英字 2 文字目以降が英大文字または数字であるような 長さが1~8 文字の記号列 でなければならない [ ] 内は省略できる ラベル 命令コード オペランド 注釈の区切りを表すためには空白 (1 文字以上の間隔 ) を入れなければならない 注釈の前には ; を付けなければならない CASLⅡのプログラム 1. プログラムはSTART 命令で始まり END 命令で終わらなければならない 2. START 命令から実行が開始され 1 行に1つずつ書かれた命令が順次実行される ただし 分岐命令 コール リターン命令 SVC 命令を実行すると指定された行あるいはOSへ実行の制御が移る 3. RET 命令が実行されるとプログラムの制御はOSまたは呼び出しルーチンへ戻る ( すなわち そのルーチンの実行が終了する ) 4. END 命令はプログラムの末尾を示すだけで 実行には無関係 5. 注釈行は任意の位置に書いてもよい ( プログラムの実行に影響しない ) ( プログラム例 ) 以下において α を記号番地あるいはレジスタとするとき (α) によっ て α の内容を表す
ラベル欄 命令コード欄 オペランド欄 (; 以降は注釈 ) EXMPL START ; EXMPLはこのプログラムの入口アドレスとなる ; この行は注釈行である LD GR1,A ; GR1に (A) をロードする LD GR2,A ; GR2にも (A) をロードする SUBA GR1,B ; GR1から (B) を減算する ; 演算の結果 (GR1)=(A)-(B) となる JPL DONE ; (A)>(B) ならDONEへジャンプする LD GR2,B ; (A) (B) のとき (GR1)=(B) となる DONE ST RET GR2,MAX ; (A),(B) の大きい方がMAXへ格納される ; 呼び出しプログラムへ戻る A DC 123 ; 定数 123を定義し Aと名づける B DC 45 ; 定数 45を定義し Aと名づける MAX DS END 1 ; 1 語の領域を確保し MAXと名付ける 上の例のように ラベル欄 命令コード欄 オペランド欄それぞれの先頭を揃える必要は必ずしもない ( 空白が1つ以上あるだけでよい ) が 揃えた方が分かりやすい 注釈は ; で始まりさえすれば どこに書いてもよい 普通は 上例のように枠など付けずに 次のように書く EXMPL START ; EXMPLはこのプログラムの入口アドレスとなる ; この行は注釈行である LD GR1,A ; GR1に (A) をロードする LD GR2,A ; GR2にも (A) をロードする SUBA GR1,B ; GR1から (B) を減算する ; 演算の結果 (GR1)=(A)-(B) となる JPL DONE ; (A)>(B) ならDONEへジャンプする LD GR2,B ; (A) (B) のとき (GR2)=(B) となる DONE ST GR2,MAX ; (A),(B) の大きい方がMAXへ格納される RET ; 呼び出しプログラムへ戻る A DC 123 ; 定数 123を定義し Aと名づける B DC 45 ; 定数 45を定義し Bと名づける MAX DS 1 ; 1 語の領域を確保し MAXと名付ける END
参考書 : 八鍬幸信 平成 14 年度版らくらく突破 CASLⅡ 技術評論者 2002. 金山裕 アセンブラプログラミング入門 近代科学社 1977. ( 古い本だけど アセンブラの原理は同じ この本はIBM System/370 用のアセンブラの解説書であり CASLⅡのアセンブラと命令体系はよく似ている ) 参考ウェブサイト : 情報処理技術者試験センター http://www.jitec.jp/1_13download/hani01.pdf ソフトウェア開発技術者午後対策とセキュリティアドミストレータ試験対策 http://dir.yahoo.co.jp/education/educational_standards_and_testing/computers _and_internet/johoshori/