• 検索結果がありません。

主記憶の使われ方 システム領域 SP スタックポインタ システム用 スタック用 プログラム起動時に OS によって確 保される (SP が決められる ) プログラム用 メインルーチン プログラム領域 命令コードの列定数 変数用領域サブルーチン命令コードの列 先頭番地は リンク時に OS によって決め

N/A
N/A
Protected

Academic year: 2021

シェア "主記憶の使われ方 システム領域 SP スタックポインタ システム用 スタック用 プログラム起動時に OS によって確 保される (SP が決められる ) プログラム用 メインルーチン プログラム領域 命令コードの列定数 変数用領域サブルーチン命令コードの列 先頭番地は リンク時に OS によって決め"

Copied!
10
0
0

読み込み中.... (全文を見る)

全文

(1)

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ビット 入力装置 出力装置 FFFF =216-1 =65535 0001 主記憶装置 64KW OF SF ZF GR0 GR1 GR7 … 16ビット 16ビット SP PR スタックポインタ プログラムレジスタ 各1ビット 汎用レジスタ群 フラグレジスタ(FR) 演算装置+制御装置

(2)

主記憶の使われ方 汎用レジスタ(general-purpose register) COMETⅡでは、以下に述べる機械語命令が使える演算(加減算、論理演算、比較演算など) しか実行することができない。演算は汎用レジスタ(GR0~GR7)を使って行われる。0番レ ジスタ(GR0)以外のレジスタは、インデックスレジスタとしても使うことができる。 フラグレジスタ(flag register) 機械語命令(演算)の実行結果によって、フラグレジスタの3ビットが以下のように設定 される。 システム用 スタック用 プログラム用 メインルーチン サブルーチン 命令コードの列 定数・変数用領域 命令コードの列 定数・変数用領域 システム領域 プログラム領域 プログラム起動時にOSによって確 保される(SPが決められる) 先頭番地は、リンク時に OSによって決められる SP スタックポインタ 空き領域 ・ ・ ・

(3)

OF Overflow Flag 算術演算命令の実行結果が-32768(=-215)~+32767(=215-1)に収 まらなくなったとき1、それ以外のとき0 論理演算命令の実行結果が0~65535(=216-1)に収まらなくなっ たとき1、それ以外のとき0 SF Sign Flag 演算結果の符号が負(215位のビットが1)のとき1、それ以外 のとき0 ZF Zero Flag 演算結果が0(全ビットが0)のとき1、それ以外のとき0 プログラムレジスタ(program register) プログラムレジスタは、「2.1 CPUの基本原理」のところで述べたアドレスレジス タと同じものである。プログラムレジスタはCOMETⅡの制御部にあり、次に実行すべき機械 語命令が格納されているアドレス(命令語の先頭番地)が入る。 スタックポインタ(stack pointer) スタック領域は、サブルーティンからの戻り番地等を格納するための領域である。スタ ックポインタは、そのスタック領域の最上位のアドレスを保持している(その値は、プロ グラム起動時にOSによって決められる)。これについては、後述する。 COMETⅡ・CASLⅡで扱える数 COMETⅡ・CASLⅡで扱える数は整数(16ビット固定小数点数)だけである。 先頭の1ビット(215 の位)は符号ビット(sign bit)として用いられる。符号ビットが 0のときは正の整数を、1のときは負の整数を表す。 正の数の場合、残りの15ビットがその値の2進数表現である。例えば、 (0 000000000000101)2 = (5)10 (0 111111111111111)2 = (32767)10 = 215-1 負の数は2の補数で表される。例えば、 (1 111111111111111)2 = (-1)10 符号 ビット 15ビット

(4)

(1 111111111111011)2 = (-5)10 (1 000000000000000)2 = (-32768)10 = -215 よって、扱える数の範囲は -215 = -32768 ~ +32767 = 215-1 である。 (問)次の数のCOMETⅡでの内部表現を求めよ。 ① 123 ② -123 ③ 0

COMETⅡの機械語

COMETⅡの機械語の詳細は定義されていないが、機械語命令は1語または2語を使って次 のようにメモリ内で表される: ① ② 8 ビット(第 1 語の上半語) 8 ビット(第 1 語の下半語) または ① ② ③ 8 ビット(第 1 語の上半語) 8 ビット(第 1 語の下半語) 16 ビット(第 2 語) ①の「命令コード」はその命令の名前を 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 で表す)。 汎用レジスタ の番号 汎用/インデッ クスレジスタ の番号 命令コード 命令の対象となるアドレス 汎用レジスタ の番号 汎用/インデッ クスレジスタ の番号 命令コード

(5)

・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 であるとする: ① ADDA GR3,PQR,GR0 ② AND GR3,GR4 ③ JZE GR6,PQR

①において、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)

(6)

となる。 上記は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Ⅱには以下のような命令がある。

(7)

・機械語命令(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はそ れぞれマクロ命令である。

(8)

命令行の書き方 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. 注釈行は任意の位置に書いてもよい(プログラムの実行に影響しない)。 (プログラム例)以下において、αを記号番地あるいはレジスタとするとき、(α) によっ てαの内容を表す。

(9)

ラベル欄 命令コード欄 オペランド欄 (;以降は注釈) EXMPL DONE A B MAX START LD LD SUBA JPL LD ST RET DC DC DS END ; EXMPLはこのプログラムの入口アドレスとなる ; この行は注釈行である GR1,A ; GR1に(A)をロードする GR2,A ; GR2にも(A)をロードする GR1,B ; GR1から(B)を減算する ; 演算の結果、(GR1)=(A)-(B)となる DONE ; (A)>(B)ならDONEへジャンプする GR2,B ; (A)≦(B)のとき、(GR1)=(B)となる GR2,MAX ; (A),(B)の大きい方がMAXへ格納される ; 呼び出しプログラムへ戻る 123 ; 定数123を定義し、Aと名づける 45 ; 定数45を定義し、Aと名づける 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

(10)

参考書: ・八鍬幸信、『平成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/

参照

関連したドキュメント

C)付為替によって決済されることが約定されてその契約が成立する。信用

HORS

攻撃者は安定して攻撃を成功させるためにメモリ空間 の固定領域に配置された ROPgadget コードを用いようとす る.2.4 節で示した ASLR が機能している場合は困難とな

※ 硬化時 間につ いては 使用材 料によ って異 なるの で使用 材料の 特性を 十分熟 知する こと

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

利用している暖房機器について今冬の使用開始月と使用終了月(見込) 、今冬の使用日 数(見込)

当該事業地内の土地で、土地収用法の規定により

[r]