CASL入門

Size: px
Start display at page:

Download "CASL入門"

Transcription

1 2 章 システム COMETⅡ の仕様 ここでは 情報処理推進機構 (IPA) が発行している情報処理技術者試験のパンフレットにある アセンブラ言語の仕様 にそって説明していきます この資料では システム COMETⅡの仕様 の中に命令の説明が書かれており アセンブラ言語 CASLⅡの仕様 には命令の説明は記載されていません 何か奇異な感じがしますが アセンブラの命令はハードウェア命令そのものであるので このような構成になっているのです - 1 -

2 2.1 ハードウェアの仕様 語 情報処理推進機構 (IPA) の説明書によれば ハードウェアの仕様として (1) から (6) まで説明が書 かれています 以下 順に説明していきます (1) 1 語は 16 ビットで, そのビットビット構成構成は, 次のとおりであるのとおりである コンピュータのメモリーの最小単位は ビット で 1 ビット 2 ビット というふうに数えます 1 ビットは 1 か 0 かの 2 種類の情報を表現できますが このままでは使いにくいので いくつかの ビットをまとめて使うことにしています CASLⅡ の場合は 16 ビットをひとつの かたまり としてあつかい この あつまり を 語 1 と呼んでい ます 主記憶 数値 制御方式 この 語 は単にメモリーの区切り ( グループ化 ) だけに使用するのではなく 後述する 汎用レジス タ の大きさも同様にしてあります (2) 主記憶の容量容量は 語で, そのアドレスアドレスは 0 ~ 番地であるである 上記 (1) で説明した 語 が集まってコンピュータのメモリー ( 主記憶 ) を形成しています COMETⅡ では この主記憶の大きさが 語あって 各語には 0~65535 までの 個の 名 前 がつけられています ビット語主記憶 16 集まって 集まって 図 2-1 ビット 語 主記憶 この 名前 を 番地 ( アドレス ) と呼んでいます という数字は 中途半端な数字だな ~ と感じるかもしれませんが この数字はちょうど 2 の 16 乗になるのです では なぜ 16 乗 なのかといいますと (5) で説明するように 汎用レジスタの大きさが 16 ビットであ るところから来ています では メモリーが 語以上ある場合はどうでしょうか 残念ながら COMETⅡ では 以上は使 用することができないのです 理由は 2 章の 実効アドレス のところで説明します (3) 数値は,16 ビットの 2 進数で表現表現するする 負数負数は,2 の補数補数で表現表現するする この説明は 1 章で行いました (4) 制御方式は逐次制御逐次制御で, 命令語は 1 語長又は 2 語長であるである 逐次制御 と書くと難しそうですが 要するに 命令を順番に実行していく というもので ごくアタリ 1 * 語 は ご と発音しますが 呼びにくいとかとカッコ良くないなどの理由から ワード と呼ばれることもあります - 2 -

3 マエの話です しかし 自動制御や携帯電話などのプログラムは逐次制御ではありません 1 アセンブラは ( 機械語は ) 命令の形でメモリーに順序良く格納されています COMETⅡではこの命令の長さが 1 語または 2 語 2 ということですので 1 語 (=16 ビット ) で表現される命令と 2 語 (=32 ビット ) で表現される命令の 2 種類があるということです このあたりは 第 4 章で詳しく説明します レジスタレジスタの種類 (5) レジスタとして,GR GR(16 ビット ),SP SP(16 ビット ),PR PR(16 ビット ),FR FR(3 ビット ) の 4 種類があるがある アセンブラでは 計算やデータのコピーなどは すべて レジスタ と呼ばれるモノ ( ハード ) を介して行われます この説明は次項で 汎用レジスタ GR( 汎用レジスタ,General Register) は,GR0 ~ GR7 の 8 個があり, 算術, 論理, 比較, シフトなどの演算演算に用いるいる アセンブラでは何の処理を行うにも汎用レジスタを経由します たとえば 変数 A の内容を変数 B へ転送する という処理の場合 C 言語 b=a; COBOL MOVE B TO A. と記述します しかし アセンブラでは直接変数間で転送を行うことができず 3 次の順序で処理をします 1 汎用レジスタへ変数 A の内容を持ってくる ( ロードする ) 2 汎用レジスタの内容を変数 B へ格納する ( ストアする ) 変数 A レジスタ変数 B 図 2-2 アセンブラでのでの変数変数のコピー この例では 転送 ( コピー ) するデータの長さが 1 語なので 上記のような対応で済みますが データの長さが 2 語とか 3 語の場合は この一連の処理を 2 回なり 3 回なり繰り返さなければなりません 更に 1000 語にもなれば 1000 回記述するわけにも行きませんから 何らかのループ処理が必要になります 1 話が難しくなるので 詳しい説明はしません 2 説明書に定義されているわけではありません 本書の勝手な設定です 詳しくは 3 章で 3 IBM 汎用機のアセンブラでは可能です - 3 -

4 また 変数 A の内容と変数 B の内容を加算し 結果を変数 C へ設定する ような処理では C 言語 c=a+b; COBOL COMPUTE C = A + B. または ADD A B GIVING C. と記述します このような場合でもアセンブラでは 1 汎用レジスタへ変数 A の内容をロードする 2 汎用レジスタへ変数 B の内容を加算する 3 汎用レジスタの内容を変数 C へストアするという処理になります 大変面倒です 変数 A 1 変数 B 2 変数 C 3 レジスタ 図 2-3 アセンブラでのでの加算処理 このように 処理に必須 な汎用レジスタですので 数もひとつだけではなく 8 個用意されています また 8 個の汎用レジスタには 0~7 までの番号がついており 汎用 ということで GR0~GR7 とも記述します (GR:General Register) 指標レジスタこのうち,GR1 ~ GR7 のレジスタレジスタは, 指標レジスタ (Index Register egister) としてアドレスアドレスの修飾修飾にもにも用いる 指標レジスタは 指標レジスタ という特定のレジスタがあるわけではなく 汎用レジスタで代用します ただし GR0 は使用できません ( 理由は第 4 章で ) ので GR1~GR7 までの 7 個が指標レジスタとしても使用できることになります では 指標レジスタはどのような場合に どのようにして使用するのでしょうか 上記 汎用レジスタ のところで述べましたが 今 変数 A から始まる 1000 語の領域を 変数 B から始まる 1000 語の領域へ転送する 場合 1 汎用レジスタへ変数 A の内容を持ってくる ( ロードする ) 2 汎用レジスタの内容を変数 B へ格納する ( ストアする ) この処理を 1000 回コーディングするのは現実的ではありません このような場合 高級言語では次のようなコーディングになるでしょうか - 4 -

5 C 言語 b[i]=a[i]; これを 1000 回繰り返す ( 実際は strcpy などの関数を使用するのでしょうけれど ) COBOL MOVE A(I) TO B(I). これを 1000 回繰り返す ( 実際は集団項目を確保し 1 回の MOVE 命令で済ますのでしょうけれど ) アセンブラでも同様にインデックスを順に変化させて 1 語ずつ転送します このときのインデックス ( 上記例では i ) の役目をするのが指標レジスタになります 詳細は第 2 部で 単に 変数 A としないで わざわざ 変数 A から始まる としたのは 次の理由からです 高級言語では 変数を確保した場合 領域の大きさにかかわらず領域全体が変数名と対応します たとえば 次のようなコーディングでは 1000 バイトの領域が確保されます C 言語 char a[1000]; COBOL A PIC X(1000). アセンブラでは A DS 1000 とした場合 変数 A に 1000 語の領域を割り当てる のではなく 1000 語の領域を確保し その先頭アドレスに A という名前をつける という意味になります スタック SP( スタックポインタ,Stack Pointer) は, スタックの最上段最上段のアドレスアドレスを保持保持しているしている まず スタック について説明します スタックとは 記憶領域の一種ですが ここへは PUSH 命令でデータを 溜め込む ことができ POP 命令で取り出すことができます ただし POP 命令では PUSH 命令で 最後に溜め込んだデータ が取り出されます つまり FILO (FirstIn LastOut) 方式になっています 今 スタックへ 100 個のデータを溜め込んだとします このとき POP 命令で最初に取り出されるのは 最後に PUSH したデータになるわけです 箱へレンガを入れることを想像してください レンガは箱の口と同じ大きさで 何段も積み重ねることができます スタックは こんなイメージです ここへ レンガを 1 個入れると箱の口からレンガが見えます レンガを次々と入れると 前に入れたレンガは後で入れたレンガで隠されるので 箱の口から見えているのは 常に最後に入れた連歌になります ここで レンガを上から取り出すと 最後に入れたレンガが取り出され 更に取り出すと一つ前に入れたレンガが取り出されます 最初に入れたレンガは最後にならないと取り出すことができません スタックへデータを入れるには 通常 PUSH 命令を使用し 取り出しは POP 命令で行います - 5 -

6 PUSH POP 図 2-4 PUSH と POP スタックへデータを入れるのは このほかに CALL 命令があります また RET 命令で取り出しが行われます この詳細については 命令の説明のところで述べます イメージとしてはこのとおりなのですが スタック機能を実装する場合 次の2つの方法が考えられます 1スタック領域の先頭から 後方 ( アドレスの増加方向 ) へ向かって順にスタックしていく方式 2スタック領域の最後から 前方 ( アドレスの減少方向 ) へ向かって順にスタックしていく方式いずれの方式が採用されているかは定義されていません 1 が どちらの方式を採るにしても 現在どこまでデータをスタックしているか を覚えておく必要があります ( ユーザー責任で覚えるのではなく CASLⅡのシステムとして ) この どこまでデータが格納されているか を覚えておくのが スタックポインタ です プログラムレジスタ PR( プログラムレジスタ,Program Register) は, 次に実行実行すべきすべき命令語命令語の先頭先頭アドレスアドレスを保持保持している 説明では 次に実行すべき命令の先頭アドレスを保持している となっています 詳しい説明の前にコンピュータが命令を規則に従って順に処理していく仕組みはどのようなものでしょうか 通常 プログラム ( 命令群 +データ群 ) はメモリー上に展開されています ( このような方式を ストアード プログラム Stored Program 方式 といいます ) プログラムの開始に先立ち オペレーティングシステムは プログラムの最初の命令が格納されているアドレスをプログラムレジスタへ格納します その後の命令の実行は次のようになります 1 最初の命令を プログラムレジスタの示すアドレスから取り出す (1 語 ) 2 命令の長さが 2 語 (4 章で詳しく説明します ) の場合は 次のアドレスから命令の続きも取り出す 3 命令の長さが 1 語のときは 1 を 2 語のときは 2 をプログラムレジスタへ加算する 4 命令を実行する 51へ戻るこのようにして 順にプログラムを実行していきます ( 上記 1~3をフェッチサイクル Fetch cycle 45をエグゼキュートサイクル Excecute cycle と 1 PUSH 命令 CALL 命令ではスタックポインタの値が 1 だけ減少し 逆に POP 命令 RET 命令では 1 だけ増加すると 定義されていますので 2 の方式を採用しているようです - 6 -

7 呼びます ) それでは分岐命令はどうするのでしょうか 高級言語で言う C 言語 goto ラベル ; COBOL GO TO ラベル. という命令です 分岐命令では 分岐先のアドレスをプログラムレジスタへ格納します 上記 4の 命令を実行する という動作は 分岐命令では まさに 分岐先のアドレスをプログラムレジスタへ格納 することになるのです プログラムレジスタは CALL 命令や RET 命令でも ちょっと変わった動きになりますが これは 4 章で説明します フラグレジスタ FR( フラグレジスタ,Flag Register) は,OF OF(Overflow Overflow Flag), ),SF SF(Sign Sign Flag), ),ZF ZF(Zero Zero Flag) と呼ぶ 3 個のビットビットからなり, 演算命令などのなどの実行実行によってによって次の値が設定設定されるされる これらのこれらの値は, 条件付き分岐命令分岐命令で参照参照されるされる プログラムを作成するときには いろいろな判断が必須になります 大小関係 ある値に等しいか 正負判断などいろいろですが 判断の後で命令を記述し 常に判断とペアでプログラムを作成します たとえば 変数 A が 1 なら 変数 B に 1 を加算する という場合 C 言語 if (a==1) b++; COBOL IF A = 1 ADD 1 TO B. というようになり 決して 判断のみ の命令というものはありません つまり C 言語 if (a==1) COBOL IF A = 1 だけではプログラムとしては意味の無いものになります ( 場合によってはコンパイル時にエラーになります ) ところがアセンブラでは 判断 とそれに続く 命令 は別々に記述します 上の命令をアセンブラで記述するには 次のような順序になります 1 変数 A の内容を汎用レジスタへロードする 2 汎用レジスタと 1 を比較する (1 が格納されているアドレスの内容 ( つまり 1 と比較する) 3 比較の結果が保存される 4 保存された結果を見て 分岐するかどうかを決定するとなります このとき 3で比較結果を保存しますが この 保存する 場所がフラグレジスタになります 4では フラグレジスタの内容を見て分岐を決めることになります - 7 -

8 ( アセンブラでは 判断のあとは 分岐 命令しか記述できません 1 を加算する というような命令は 分岐先で記述します 詳細は 5 章で ) フラグレジスタに値が設定されるのは 比較命令だけではなく 次のような命令でも設定されます 比較命令 ( 算術比較 論理比較 ) ロード命令算術加算 論理加算 算術減算 論理減算論理積 論理和 排他的論理和シフト命令 ( 算術シフト 論理シフト ) このように 多くの ( というよりは ほとんどの ) 命令でフラグレジスタの内容が変わります ところで 判断は必ずしも比較命令のみで行うわけではありません 上述のように ロード命令 でもフラグレジスタが設定されるので ある変数が正 負 ゼロかどうかというような判断をする場合 比較をしなくても判断することができます ある変数をレジスタへロードすると その内容 ( 正 / 負 / ゼロ ) によってフラグレジスタには異なる値が設定されますので あとは分岐命令を記述すればよいのです 以下 3 種類のフラグレジスタについて説明します OF 算術演算命令の場合場合は, 演算結果が ~ に収まらなくなったとき 1 になり, それ以外のとき 0 になる 論理演算命令論理演算命令の場合場合は, 演算結果が 0 ~ に収まらなくなったとき 1 になり, それ以外以外のとき 0 になる 算術演算は (CASLⅡでは) 足し算と引き算のみが定義されています 足し算 または引き算の結果が ~ の間に収まらないときに OF が 1 に設定され 収まるときには 0 に設定されます 例えば は より大きいので 1 が設定されます はちょうど となり 0 が設定されます ちなみに ~ というのは レジスタが 16 ビットで うち 1 ビットは符号で使用しているため このような制限になります また 論理演算では符号がありませんから 最上位ビットもすべて数値の一部と考えて 0~65535 までとなります 表 2-1 符号なしなし数値数値の下限下限と上限 SF 演算結果の符号符号が負 ( ビット番号 15 が 1) のとき 1, それ以外以外のとき 0 になる ZF 演算結果が零 ( 全部のビットビットが 0) のとき 1, それ以外以外のとき 0 になる 演算結果 符合については 1 章を参照してください - 8 -

9 論理演算 (6) 論理加算又は論理減算論理減算は, 被演算データデータを符号符号のないのない数値数値とみなして, 加算又は減算減算するする これについては 算術 論理演算命令 のところで 詳しく説明します 2.2 実効アドレス 命令を学習するに先立ち 実効アドレスについて説明します 実効アドレス説明にもあるとおり 実効アドレスとは adr で示されるアドレスと指標レジスタの内容を加算し で割った余り をいいます 指標レジスタは 説明した通りインデックスの代わりとして用いますから adr に加算するとして なぜ で割るのでしょうか 理由はふたつあります 理由 1: このハードのメモリーが 番地までしか無いからです これ以上のアドレスは存在しませんから使いようがありません 理由 2: これはちょっと難しいのですが このハードは 16 ビットを基本として設計されています 16 ビットで表現できる最大の値 ( 符号を考慮しないとして ) が で これを越えるとオーバーフローして 残り ( つまり剰余 ) が 0~65535 までになるからです 例えば 3 桁しかないソロバンを考えてみてください いま 900 が置かれているとして これに 200 を加えるとどうなるでしょうか 答えは 1100 ですが 3 桁しかありませんから 千 の位はなくなって 残っているのは 100 だけになります これと同じように CASLⅡでも 16 ビットで表現できる範囲 を超えた場合 超えた部分がなくなってしまいます 2.3 命令 説明書によれば 命令は大きく次のように分類 1 されています 1 ロード ストア ロードアドレス命令 2 算術 論理演算命令 3 比較演算命令 4 シフト演算命令 5 分岐命令 6 スタック操作命令 7 コール リターン命令 1 IBM のメインフレームでは スタック がありませんので スタック操作命令 というのはありません また コール リターン命令 は 分岐命令 に分類されます また その他 の ノーオペレーション命令 も 分岐命令 に分類されます - 9 -

10 8 その他以下 順に説明します ロード命令ロード命令にはふたつの書き方があります それぞれについて説明します LD r1,r2 この命令は r2 の内容を r1 へコピーするものです 仮に 汎用レジスタ 3 に 1000 という値が入っていたとします LD GR1,GR3 これで 汎用レジスタ 1 にも 1000 という値が設定されます 汎用レジスタ 1 の元の値が何であれ 1000 に設定されます 一方 GR2 の値はそのままかわらずに残ります レジスタの書き方として たとえば汎用レジスタ 1 を指定する場合 説明書では GR1 と書くと定義されています IBM メインフレームのアセンブラ言語では単に 1 と書き 他の書き方はエラーになります しかし CASLⅡでは LD 1,2 と書いた場合 2 は 汎用レジスタ 2 を指すのか それとも 2 番地 を指すのか判別できないことになってしまいます そこでこれを区別するためには 汎用レジスタは GR を付けて書くことになります ただし この場合 変数名として GR0 から GR7 は使用できないことになります アセンブラ言語で予約語があるというのも首をかしげるところではありますがまた 以降は 汎用レジスタ という言葉の代わりに GR と書くことにします この命令は 一体何に使用するのでしょうか 単に レジスタの値をコピーする目的もありますが レジスタの内容が正の値 / 負の値 / ゼロかを判 定する場合にも使用します この命令実行後に r1 の値 ( つまり r2 の値 ) によりフラグレジスタが次のように設定されます OF SF ZF r1> r1= r1< 表 2-2 LD 命令後のフラグレジスタフラグレジスタの値 OF は常にゼロが設定されますので SF と ZF の値から r1 が正 / 負 / ゼロのいずれであったかを判 定できます - 10-

11 ところで LD GR1,GR1 という命令を実行するとどのような結果になるのでしょうか これは GR1 を GR1 へコピーする命令ですから 何も変化は無いように見えます 確かに 汎用レジスタやメモリーの内容は変化しませんが フラグレジスタがセットされます LD r,adr[,x] この命令では実効アドレス (adr[,x]) の内容が汎用レジスタ r へコピーされます LD GR1,1000 この命令では 1000 番地の内容が GR1 へコピーされます 1000 番地の内容は変化しません 通常プログラムを作るときは 1000 などの直接数値を書くことはあまりありません 通常は変数を書くことになります たとえば LD GR1,KINGAKU というように書き アセンブラ ( コンパイラ ) が KINGAKU を 1000 に変換します 詳細は プログラムの演習のところで説明します GR1 へは 1000 番地の内容内容 がコピーコピーされるのであってされるのであって 1000 がセットセットされるのではありませんされるのではありません それでは インデックス (x) が指定されている場合はどうなるでしょうか 今 GR2 に 500 が入っているとします LD GR1,1000,GR2 この命令では 1000 と GR2 の中身である 500 が加算されて ( =1500) 1500 番地の内容が GR1 へコピーされます 1500 番地の内容は変化しません なお どちらの場合でもコピーされた値によってフラグレジスタが更新されます ストア命令ストア命令は ロード命令と反対の動きをします つまり 汎用レジスタの内容が実効アドレスの番地へコピーされます 汎用レジスタの内容は変化しません ST r,adr[,x] いま GR2 に 500 が入っているとします ST GR1,1000,GR2 この命令では GR1 の内容が 1500 番地へコピーされます 汎用レジスタの内容は どれも変わりません インデックスを使用しない場合は ST GR1,

12 のように記述します ストア命令では フラグレジスタも設定されませんので そのまま残っています ところで ストア命令には ST r1,r2 という形式の書き方はありません 仮に あった としたら ST GR1,GR2 とでもなって GR1 の内容を GR2 へコピーする という動作になるのでしょうか でも これは LD GR2,GR1 とまったく同じ動作 1 になります 同じ動作であれば 命令を二つ用意することもないわけです ロードアドレス命令この命令はロード命令と似ていますが 名前の通り アドレスそのもの をレジスタへ設定します LAD GR1,1000 この命令では 実効アドレスそのものが GR1 に設定されます つまり 1000 が設定されます LD GR1,1000 では 1000 番地の内容内容 が設定されましたが LAD 命令では 1000 そのものが設定されるわけです 仮に 1000 番地の内容が 300 だった場合 LD 命令では 300 が設定されます 1000 番地 LAD 命令 LD 命令 図 2-5 LAD 命令と LD 命令それでは インデックスを使用した場合はどうでしょうか 仮に ( 例によって ) GR2 に 500 が入っているものとします LAD GR1,1000,GR2 この命令では 実効アドレス 1500(1000+GR2 の中身の 500) が GR1 に設定されます つまり GR1 は 1500 になります くどいようですが 1500 番地の中身 が設定されるのではありません 1 厳密には フラグレジスタが設定されない点が ロード命令とは異なりますが - 12-

13 それでは 次の命令はどうなるでしょうか LAD GR1,1,GR1 GR1 の内容を x とします 実効アドレス部分は 1,GR1 ですから実効アドレスは 1+x になり これが GR1 に設定されます 元の GR1 の中身x 命令実行後の中身x+1 つまり GR1 に +1 する命令というわけです LAD GR1,5,GR1 と書けば GR1 に 5 が加算されますし LAD GR1,-2,GR1 と書けば GR1 から 2 が引かれることになります なお ロードアドレス命令ではフラグレジスタは変化しません ところで この命令は汎用レジスタにある数を加えたり引いたりするほかに 何に使うのでしょうか これは プログラム演習 の章で説明します アセンブラ言語の醍醐味が このロードアドレス命令なのです 算術加算命令何やらいかめしい名前ですが 要するに 足し算 の命令です 算術加算 というからには 算術でない加算 という変な命令もあるのでしょうか あります 論理加算 という命令です ( 後述します ) CASLⅡでは 算術 と 論理 を レジスタの一番左のビットを符号としてあつかうか否か で分けています 符号として扱う命令が 算術 という命令で 扱わないのが 論理 という命令になります ADDA r1,r2 もうお分かりかと思いますが この命令では 汎用レジスタ r2 の内容を r1 へ加算し 結果が r1 に入ります r2 の内容は変化しません 今 GR1 に 100 GR2 に 200 が入っていたとすれば ADDA GR1,GR2 で 汎用レジスタ 1 には 300 が格納されます 汎用レジスタ 2 は元のままです ADDA r,adr[,x] この記述では 実行アドレスの内容が汎用レジスタ r に加算されます 実効アドレスの内容は変わりません - 13-

14 いま 汎用レジスタ 1 に 100 汎用レジスタ 2 に 200 ( メモリーの )1200 番地には 300 が入っていたとすれば ADDA GR1,1000,GR2 adr が 1000 インデックス( 汎用レジスタ 2) には 200 が入っていますから 実効アドレスは 1200 になりますので 1200 番地の内容である 300 が汎用レジスタ 1 の 100 に加算されて 結果 汎用レジスタ 1 には 400( ) が設定されます 汎用レジスタ 2 に内容も 1200 番地の内容も変化はありません 算術加算命令では どちらの書き方でもフラグレジスタが設定されます OF SF ZF r1>0 *1 0 0 r1=0 *1 0 1 r1<0 *1 1 0 *1 計算結果が ~ の間に収まらない場合は 1 に 収まれば 0 になる 論理加算命令 表 2-3 ADDA 命令後のフラグレジスタフラグレジスタの値 基本的には算術加算と同じですが 符号を考慮しない点が算術加算と違うところです 符号を考慮 しませんから 負の数値という概念は無く 0~65535 までの範囲の値になります 書き方 考え方は算術加算と同じです フラグレジスタのうち OF については設定のされ方が算術加算とは少し異なります 論理 加算です から ~ までではなく 0~ までの間に収まらないときに OF が設定されます 算術減算命令 足し算が引き算になるだけで 考え方は算術加算と同じです SUBA r1,r2 この書き方は r1 の内容から r2 の内容を引き算し 結果を r1 に設定します R2 の内容は変わりま せん SUBA r,adr[,x] これも算術加算と同じで r から実効アドレスで示されるアドレスの内容を引き算します 今 汎用レジスタ 1 に 1000 汎用レジスタ 2 に 番地の内容が 600 であるとき SUBA GR1,1000,GR2 は どうなるでしょうか 実効アドレス ( インデックスの内容 ) 実効アドレスの内容 (1300 番地の内容 ) 600 したがって =400 が GR1 に設定されます GR2 の内容 1300 番地の内容は ともに変化し 1 オーバーフローした場合 加算結果がどうなるかについては規定されていないが オーバーフローした残りの部 分 ( 加算結果を で割った余り ) が設定されると思われる - 14-

15 ません 論理減算命令符号を考慮しない減算命令で 考え方は算術減算と同じです 論理積 論理和論理和 排他的論理和命令それぞれ 汎用レジスタと 汎用レジスタまたは実行アドレスの指す番地の内容との間で ビット毎に論理積 論理和 排他的論理和をとり 結果を汎用レジスタへセットする命令です 演算は 1 語 16 ビットすべてのビットについて行われます AND r1,r2 r1 と r2 の論理積をとり 結果を r1 へセットする OR r1,adr1 r1 と ADR1 番地の内容とで論理和をとり 結果を r1 へセットする 論理積 論理和 排他的論理和の演算は次のように定義されています 論理積 論理和 排他的論理和 ビット 1 表 2-4 論理演算の結果 例 ビット 2 結果説明 それでは実際の例を見てみましょう 両方が 1 のときのみ結果が 1 になる 少なくともどちらか片方が 1 のとき 1 となる 両方が異なるとき 1 となり 同じ時は 0 となる 今 GR1 がビットで で GR2 が だったとします AND GR1 GR2 とすると GR GR AND 結果 となりますので この AND 結果が GR1 に設定されます GR2 の内容は変化しません フラグレジスタは3つとも 0 が設定されます ところで これらの命令はどんなときに使用するのでしょうか 加算命令や減算命令は使い道がわかるのですが これらの命令はちょっと ( 使い道の ) 想像がつきませんね ということで 例をあげてみます - 15-

16 AND 命令 よく使用するのは ある特定のビットが 0 か 1 かを判断する 場合です 例えば 汎用レジスタに をセットしておき 1 これをメモリーとの間で論理積演 算します 結果が 全ビットゼロになれば ( つまり フラグレジスタ ZF がゼロであれば ) メモリーの左から 4 ビット 目は もとは 0 だった ということになりますし ZF がゼロでなければ メモリーの左から 4 ビット目は もとは 1 だった ということになります OR 命令 COMETⅡ では ( どのコンピュータもそうですが ) 文字に 16 進コードが割り振られており これを 文字 コード と呼んでいます COMETⅡ では 1 バイト文字 2 のみ定義されており このうち数字の 0 ~ 9 は それぞれ X 30 ~ X 39 に割り振られています いま 汎用レジスタに 2 進数の数値 ( ただし 0~9) があったとき これを文字に変換するにはどうす れば良いでしょうか COMETⅡ では 文字 は 1 語に 1 文字で格納され 上位 8 ビット (1 語の左半分 ) は 0 になると定義さ れていますから X 0000 X 0030 X 0001 X 0031 X 0009 X 0039 に変換するわけです このような場合 いちばん簡単なのは X 0030 で論理和をとる という方法です たとえば 5(X 0005 ) と X 0030 の論理和は X 0035 になりますので 文字に変換されたこ とになります 逆に文字から数値への変換は X 000F で論理積をとればよいことになります ( 確認してみてくださ い ) XOR 命令 これは難物です あまり 良い使用例が思い浮かびません あまり役立つとは思えませんが 次のような例はどうでしょうか 今 GR GR が格納されていたとします これに次の演算を行います 1 XOR GR1,GR2 2 XOR GR2,GR1 3 XOR GR1,GR2 1 LD GR1,=#1000 または LAD GR1,#1000 でセットできる 2 1 バイト =8 ビットなので 最大 256 種類しか定義できない 漢字コードなどはこれでは不足なので 16 ビットが割り 振られており これを 2 バイトコードという - 16-

17 順にやってみましょう 1 は GR GR 結果 GR は GR GR 結果 GR は GR GR 結果 GR さて なにか気づきましたでしょうか そうです GR1 と GR2 の内容が入れ替わっていますね ( 単にそれだけですが ) 比較演算命令 比較演算命令は 値の大小を比較し 結果をフラグレジスタへ設定する命令です 通常この命令の 後はジャンプ命令となります 比較には 算術比較と論理比較があります 算術比較は比較する値を符号付き数値 ( 最左ビットを符号として扱う ) として比較しますから 比較す る数値の範囲は ~ の間となります 論理比較では最左ビットを符号としては見ないで 数値の一部として判断します 従って比較できる 範囲は 0~65535 までの間となります 次の表は数値 1 と数値 2 を それぞれ算術比較と論理比較でどのような比較結果になるかをまとめ たものです ( 値はいずれも 16 進表示です ) 1 数値 FFFF 数値 FFF 0000 FFFF 算術比較 1>2 1<2 1<2 1>2 論理比較 1>2 1>2 1>2 1<2 表 2-5 論理比較と算術比較算術比較の結果 比較は 汎用レジスタ同士 または汎用レジスタと実効アドレスの内容とで行われます 前述しましたように比較命令は 比較して フラグレジスタに結果を設定する 命令です 比較の後 には ( その結果次第で ) ジャンプしたり 何らかの演算 更に比較などを行いますが CASLⅡ では ジャンプ命令しか記述できません ( 記述はできますが フラグレジスタの値によって何かを行うという 命令は ジャンプ命令しかありません ) 比較命令の後に フラグレジスタの内容を変化させない 命令 例えばストア命令やロードアドレス 命令などをはさんで その後にジャンプ命令を書いてもかまいませんが バグの元になりますので避 けるほうが賢明です 今 次のような処理をすることを考えてみます 1 GR1 の内容を変数 A へ格納する 2 GR1 と GR2 を比較し GR1>GR2 であれば NEXT へジャンプする - 17-

18 通常は 次のように記述します ST CPA JPL GR1,A GR1,GR2 NEXT それでは 次のような書き方はどうでしょうか CPA ST JPL GR1,GR2 GR1,A NEXT これでもプログラムは同じように動作しますが 少し不自然です 下の例では JPL 命令は どの命令の結果を見るのだろう という疑問が湧きます ST 命令ではフラグレジスタは変化しませんので CPA 命令の結果を見ていることは明白ですが もしかしたら ST 命令でもフラグレジスタが変化するのだろうか と一瞬でも考えてしまいます シフト命令シフト命令は 汎用レジスタの 16 ビットを左または右へ指定されたビット数だけ移動させる命令です 汎用レジスタは 16 ビットしかありませんので 17 ビット以上のシフトは意味がありません シフト命令も加算 減算命令と同様に 算術シフト と 論理シフト があり 算術シフトは符号を考慮した命令で 論理シフトは考慮しない命令です 算術シフトシフト命令左シフトと右シフトがあります 左シフト ( 算術 ) 次の図のように ビットを移動します 次の例は 左へ 2 ビット分算術シフトさせた例です ビット位置 シフト前 シフト後 図 2-6 算術左シフト ( 誤 ) それでは シフトによって こぼれ落ちる ビット ( 上図の黄色の部分 ) はどうなるのでしょうか これは 無くなって しまいます また シフトによって発生した 隙間 のビット ( 図の水色の部分 ) には何が入るのでしょうか ここにはすべて 0 が格納されます それではシフトはどのような場合に使用されるのでしょうか 一番分かりやすいのが 乗算 と 除算 です 左へ 1 ビットシフトするということは 2 倍する ということになり 左へ n ビットシフトするということは 2 n 倍するということになります 逆に右へシフトするということは除算になります 右へ n ビットシフトするということは 2 n で割るということになります - 18-

19 このように乗算や除算に使用できますが 残念ながら 2 n 倍する場合や 2 n で割る場合にしか使用できません ここで質問です 負 の数値は最左ビット(15 ビット目 ) が 1 だったはず 上の例だと 負の数値の場合 左シフトを行うと状況によって正の数になってしまうことがあります 右シフトでは ( 隙間に 0 が詰まりますから ) 必ず正の数になってしまいます これはおかしいですね 実は 上図が間違っているのです 正しくは次のようになります ビット位置 シフト前 シフト後 図 2-7 算術左シフト ( 正 ) シフトは 0~14 ビット目の 15 ビットで行われ 最左 (15 ビット目 ) は常に 15 ビット目へコピーされます 従って こぼれ落ちる のは 13 ビット目と 14 ビット目になります 右シフト ( 算術 ) では 右へ算術シフトする場合はどうなるのでしょうか 右へ 3 ビットシフトする場合は 次のようになります ビット位置 シフト前 シフト後 図 2-8 算術右シフトこの場合 右の 3 ビット ( 図の黄色部分 ) は こぼれ落ちて なくなります 符号 ( 最左ビット ) は左シフトと同様に 符号がコピーされます 右シフトによってできた 隙間 ( 図の緑部分 ) にも符号がコピーされます なぜ このような面倒なことをするのでしょうか 実際に確認してみましょう 今 話を単純にするために 4 ビットの符号付き数値 ( 第 1 章で説明した ) で考えてみましょう 符号付きですから 最左ビットは符号ビットになります 1 ビット右シフトは 2 で割ることと同じ と説明しましたが これを確かめてみます まず 5 を 2 で割ってみましょう 5 は 0101 ですから 右へ 1 ビットシフトすると 0010 になります これは 2 ですね( 余りは無視 ) - 19-

20 では -5 を 2 で割ってみましょう -5 はビットでは 1011 になりますから となります これは-3 1 ですから 確かにこのシフト方法で良い 2 ことがわかります 余談ですが 負の数値を正の数値で割ったときの答え ( 商 ) と余り ( 剰余 ) はどうなるのでしょうか 7 を 2 で割ると 商 =3 剰余 =1 となりますが これは問題の無いところです では -7 を 2 で割るとどうなるのでしょうか 商 =-3 剰余 =-1 でしょうか 余りが負の数になるのはなんとなくヘン という気がします であれば 商 =-4 剰余 =1 でしょうか もし剰余として負の数値を認めるのであれば 7 を 2 で割る場合も 商 =4 剰余 =-1 としてもよさそうです ちなみにマイクロソフトの Excel で剰余を求めたところ -7 を 2 で割った剰余は 1 となりました ということは商は-4 ということですね Excel で単純に-7/2 としますと 答えが-3.5 となり 少数以下が計算されてしまいます QUOTIENT という関数があるようですが これは商の小数部を切り捨てるという関数ですので ちょっと意味が違ってきます しかし そういえば 切り捨て という動作も考えてみると その値を超えない最大の整数にする のでしょうか それとも ゼロに近い整数にする のでしょうか 3.5 を切り捨てますと 3 になります これは問題ありません では -3.5 を切り捨てるとどうなるのでしょうか 答えは-3 でしょうか でも 越えない最大の整数 という定義をとれば -4 になります 浅学の筆者にはよく分かりませんが 論理シフトシフト命令算術シフト命令の説明で 実は 上図が間違っているのです と書きましたが この間違ったシフト方法が論理シフトです 間違った というと語弊がありますが つまり 符号を意識しない シフトが論理シフトというわけです 左シフト最左ビットを特別なビットとみないで シフトするビット数だけ左へ移動します こぼれたビット はなくなりますし 右側の 空いた ところには無条件に 0 がセットされます 右シフト左シフトと同様に右へシフトされます 左の 空いた 部分には 算術シフトでは符号ビットがコピーされましたが 単に 0 がセットされます の 2 の補数 は 0011 で 3 になります つまり -5 を 2 で割ると商 =-3 剰余 =1 ということです 2 というよりも そうなるようにシフト命令を設計してあるというほうが正確でしょう - 20-

21 右の こぼれた ビットはなくなります 論理シフトシフトの使い道 論理シフト命令は ある特定のビットが 0 か 1 かを判定する際によく使用されます 例えば 変数 A の左から 3 ビット目が 0 か 1 かを判断する という場合 LD GR1,A ;1 SLL GR1,2 ;2 JMI BITON ;3 1 の命令で変数 A を GR1 へロードします 2 の命令で左へ 2 ビットシフトしますから 最初の ( つまり変数 A の ) 左から数えて 3 ビット目が GR1 の 最左ビットのところへ位置します ビット位置 シフト前 シフト後 図 2-9 ビットの判定このビットが 1 であれば ( 負の数値なので ) フラグレジスタ SF が 1 に設定されますから ジャンプ命令で判断をすることができます 上記の3では 負の数値なら ( ビットが ON なら )BITON というところへジャンプする ( 次の命令は BITON から ) ことになります また 上記 2で SLL GR1,3 とすれば 0 か 1 かを判断するビットがなくなってしまいますが フラグレジスタ OF には レジスタから 最後に送り出されたビットの値が設定される と定義されていますので 3 の命令を JOV BITON としても良いことになります つまり 上記 1~3 の命令は 次のように書いても同じということになります LD GR1,A ;1 SLL GR1,3 ;2 JOV BITON ;3 これは右シフトの場合でも同じです シフト命令命令の注意点 シフト命令の シフトするビット数 は実効アドレスで示されたビット数だけシフトされますが これは 実効アドレスで示されたアドレスの内容分シフトする ということではありませんありません 例を示しましょう - 21-

22 今 変数 A が 100 番地にあり その内容が 3 であったとします SLL GR1,A とした場合 変数 A の内容が 3 だからといって 3 ビットシフトされるのではありません あくまでも 100 ビットシフトされることになります ( 変数 A が 100 番地なので ) 100 ビット左へ論理シフトすれば GR1 はゼロになってしまいますが このようなわけですから シフト命令のディスプレースメント 1 に変数 ( リロケータブルターム ) を指定することは まず考えられず ほとんどの場合数値そのもの ( アブソリュートターム ) を指定します これは 変数のアドレスが実行時に何番地になるかは予測できないためです (OS がプログラムのロード時に決定します ) ただし インデックスレジスタは使用することがあります シフト数が実行時まで決定できないような場合に SLL GR1,0,GR2 とすれば 実効アドレスは 0+GR2 の内容 になりますから 結果として GR2 の内容分だけシフトされることになります 分岐命令 フラグレジスタの内容により分岐する命令です 次の条件が成立する ( 真 ) ときジャンプし 条件にあてはまらない ( 偽 ) ときはジャンプせず次の命令 へ移ります ジャンプする条件 ジャンプ命令 OF SF ZF JPL 0 0 JMI 1 JNZ 0 JZE 1 JOV 1 JUMP 無条件にジャンプ 表 2-6 フラグレジスタの値と分岐条件 空白部分は 参照しない ということです 従って たとえば JPL 命令は SF と ZF が 0 のときジャンプし これ以外の場合はジャンプしないという ことになります この表を見るときは注意が必要です 1 ディスプレースメント リロケータブルタームについては 4 章を参照してください - 22-

23 例えば OF=1 SF=0 ZF=0 だった場合 各命令は次のようになります JPL JMI JNZ JZE JOV JUMP SF=0 ZF=0 なのでジャンプする SF=0 なので ジャンプしない ZF=0 なのでジャンプする ZF=0 なのでジャンプしない OF=1 なのでジャンプする ジャンプする 表 2-7 ジャンプ命令命令の意味 分岐命令のオペランドには インデックスを指定することができます これは次のような使用法があり ます JUMP TBL1,GR2 ;1 TBL1 JUMP A1 ;2 JUMP A2 ;3 JUMP A3 ;4 この 1 の JUMP 命令のオペランドは もし GR2 の指定が無く JUMP TBL1 だけであれば 単に TBL1 へジャンプします ( その後 A1 へジャンプすることになりますが ) 今 GR2 に 2 が格納されていた場合はどうなるでしょうか 仮に TBL1 が 100 番地にあったとしますと 1の命令の実行アドレスは 102(100+2) になりますから 102 番地へジャンプします 102 番地はちょうど3の命令のところですから JUMP A2 ;3 が実行されて A2 へジャンプすることになります これは COBOL の GO TO A1 A2 DEPENDING ON XX に似ています 似てはいますが 少し違います 1の命令は GR2 が偶数のときにしかうまく行きません 2や3の JUMP 命令は 2 語の命令 1 になっているからです それでは GR2 が偶数のみでなく奇数の値もとる場合 ( これが普通ですが ) はどうすれば良いでしょうか このような場合は 1のめ異例の前に次のような命令をいれて GR2 を 2 倍してやればよい訳です SLL GR2,1 他にも もっと アセンブラチック な方法がありますが それは第 5 章で 1 2 語と定義されているわけではなく 本書の勝手な設定 詳しくは 4 章参照 - 23-

24 スタック操作命令 PUSH 命令 PUSH 命令はスタックにデータ ( 実効アドレス ) を 1 件追加する命令です たとえば PUSH KINGAKU とすれば KINGAKU のアドレス (KINGAKU の内容ではありません ) がスタックに追加されます また 例えば GR1 が 3 であるとき PUSH KINGAKU,GR1 とすれば KINGAKU のアドレス (KINGAKU に割り当てられているアドレス )+3 がスタックに追加されます スタックについてはハードウェアの仕様のところで説明しましたが この命令はいったいどのようなときに使用するのでしょうか CALL 命令でも使用されますが これについては CALL 命令のところで説明します まず 思いつく使い方としては サブルーチンにパラメータのアドレスを渡す領域が考えられますが これは RET 命令との関連でうまく行きません ( これについても CALL 命令で説明します ) では 以下で PUSH 命令と POP 命令の両方を説明しましょう しかし その前に POP 命令です POP 命令 POP 命令はスタックから 1 個取り出す命令です PUSH/POP 命令 CALL 命令は主に 外部プログラム を呼び出すための命令です 外部プログラムとは 別にアセンブルしたプログラム と考えて良いでしょう PUSH 命令と POP 命令 外部プログラムではないプログラム ( 内部ルーチン ) を呼ぶ場合に便利なようです この機能は C 言語では定義されていません ( もともと内部ルーチン = 関数の呼び出しばかりで出来ている言語ですが ) が COBOL では PERFORM 命令として定義されています 次のような例を考えてみましょう 今 テストの平均点を求める ことを考えてみます 平均点は 国語と算数の 2 教科について求めるとします 平均点を求めるルーチンを HEIKIN とします - 24-

25 ( 国語の全員分の点数読込 ) PUSH NEXT1 ;1 JUMP HEIKIN ;2 NEXT1 ( 算数の全員分の点数読込 ) PUSH NEXT2 ;3 JUMP HEIKIN ;4 NEXT2 HEIKIN POP GR1 ;5 JUMP 0,GR1 ;6 まず 1 では 内部ルーチン HEIKIN を呼んだあとで HEIKIN からの戻り先として NEXT1 のアドレス を PUSH 命令でスタックへ保存しています そして 2 で HEIKIN へジャンプします HEIKIN では 処理を終えた後 5 の POP 命令でデータを 1 個取り出しますが これは 1 で PUSH した データになりますから NEXT1 のアドレスを取り出すことになります 次 6 のジャンプ命令で NEXT1 へジャンプします ( つまり 2 の次の命令へ戻ってきたことになりま す ) なお この 6 の使い方は分岐命令のところで説明しました さらに 3 と 4 でも同様なことをしていますが この場合では戻り先が NEXT2 になっていますので 5 と 6 で 今度は NEXT2 へ戻ってきます 最初のスタックの状態 NEXT1 のアドレス 1 で 戻り先 NEXT1 をスタックへ PUSH した状態 NEXT1 のアドレス NEXT1 のアドレス 5 で 戻り先 NEXT1 をスタックか ら取り出した状態 - 25-

26 しかし こんな面倒なことをしないで 単に戻り先アドレスを覚えておくようにしてはどうでしょうか つまり 上のプログラムを次のように変更します ( 国語の全員分の点数読込 ) LAD GR1,NEXT1 ;1 ST GR1,MODORI JUMP HEIKIN ;2 NEXT1 ( 算数の全員分の点数読込 ) LAD GR1,NEXT2 ;3 ST GR1,MODORI JUMP HEIKIN ;4 NEXT2 HEIKIN LD GR1,MODORI ;5 JUMP 0,GR1 ;6 MODORI DS 1 ;7 このプログラムでは 1 で PUSH 命令の替わりに戻りアドレスを 7 の MODORI へ格納しています 3 で も同様です 戻る場合は 戻り先アドレスを POP 命令で取得するのではなく MODORI に保存しておいたアドレスへ 戻っています これでも立派に動作しますが ひとつ問題があります いま HEIKIN からさらに GOUKEI という内部ルーチンを呼ぶとしたらどうなるでしょうか ( 国語の全員分の点数読込 ) LAD GR1,NEXT1 ;1 ST GR1,MODORI JUMP HEIKIN ;2 NEXT1 ( 算数の全員分の点数読込 ) LAD GR1,NEXT2 ;3 ST GR1,MODORI JUMP HEIKIN ;4 NEXT2 HEIKIN LAD GR1,HEI1 ;5 ST GR1,MODORI ;6 JUMP GOUKEI ;7 HEI1 LD GR1,MODORI ;8 JUMP 0,GR1 ;9-26-

27 GOUKEI LD GR1,MODORI ;10 JUMP 0,GR1 ;11 MODORI DS 1 内部ルーチン HEIKIN では GOUKEI を呼ぶために 5 と 6 で戻りアドレスを MODORI に保存しています そして 7 で GOUKEI へジャンプします GOUKEI では 10 で戻りアドレスを MODORI から取得し 11 で戻ります ( つまり HEI1 へ戻ってきます ) HEIKIN は更にメインへ戻ろうとして 8 を実行しますが このとき MODORI には 6 で格納されたアドレ ス つまり HEI1 のアドレスが格納されています したがって 9 のジャンプ命令では また HEI1 へ戻ってしまいます つまり を繰り返すことになり いつまでたっても終了しません ( 永久ループ ) これを防ぐためにはどうすれば良いでしょうか MODORI を 2 つ用意し そのうち 1 つを HEIKIN から戻るため に 残りを GOUKEI から戻るため に使用 するという考えではどうでしょうか これは良い考えのように思えますが それでは GOUKEI から更に呼び出す必要が出た場合どうなるで しょうか またひとつ用意しなければなりません これではキリが無いですね そこで次のようなことを考えます 戻り先アドレスを格納する領域をたくさん用意し その先頭に RTNADR という名前をつける RTNADR のどこへ格納したかを覚えておくために 変数 RTNPOS を用意し 初期値をゼロにしておく 戻り先を格納するときは RTNADR の RTNPOS 番目へ格納し RTNPOS に +1 しておく 戻るときは RTNPOS から 1 を引き RTNADR の RTNPOS 番目の内容を取り出して そこへ戻る これだとうまく行きそうですが なんだか面倒ですね そこで これを 仕組み として実装したのが PUSH/POP 命令なのです コール リターンリターン命令 CALL 命令 CALL 命令はサブルーチンを呼び出す命令です これについては 6 章で詳しく説明しますが 次の動作を行います 1 CALL 命令の次のアドレスをスタックへ PUSH し サブルーチンの先頭へ分岐する 2 RET 命令では (CALL 命令でスタックされたアドレスを ) スタックから取り出し その取り出したアド レスへ分岐します RET 命令 CASLⅡ の説明では プログラムの動作を終了する 1 命令として この RET 命令を使用するとされていま す RET 命令は サブルーチンから戻る場合に使用する目的で使用される命令です 少し話が難しくなりますが 1 END 命令がありますが これはプログラム全体の終わりを示すもので プログラムの実行を終了するものではあり ません - 27-

28 プログラムには メインプログラム ( メインルーチン ) と サブプログラム( サブルーチン ) があります 一般にサブルーチンはメインプログラムから呼ばれて動作するもので サブルーチン自体が独自で実行されることはありません しかし コンピュータ全体を考えてみますと 一番 大元 で動いているのは OS( オペレーティング システム ) です 従って メインプログラムといえども OS から見れば ある種のサブルーチンの位置付けになります というわけで RET 命令を プログラム実行の終了 として使用するとされているわけです OS から呼び出されるとき OS は (OS への ) 戻り先をスタックへ格納してから呼び出します その他の命令 SVC 命令日本語では スーパーバイザーコール 命令とあり 説明には 実効アドレスを引数として割出しを行う とあります スーパーバイザー 引数 割出し と 難しそうな言葉が出てきました 順に説明します スーパーバイザーコンピュータに処理を行わせるために プログラムを作成し それを実行させますが このプログラムの実行は OS( オペレーティング システム ) が管理しています つまり ユーザーの作成したプログラムは すべて OS の管理下にあるわけで このようなプログラムを プロブレム プログラム(problem program) といいます 我々が作成するプログラムは ほとんどがプロブレム プログラム ( 面倒なので 以下 PP と書きます) ですし コンパイラやアセンブラなど通常はメーカーから提供されるプログラムも やはり PP です ところで コンピュータは通常 OS 制御の下で PP が動いているわけですから (OS もプログラムですから ) 複数のプログラムが同時に動いている 1 ことになります いま PP にバグがあって OS のデータ部分を書き換えてしまうとどうなるでしょうか OS が正しく動作しなくなってしまいます OS はコンピュータの よりどころ ですから OS が動かなくなればコンピュータ自身が止まったり暴走したりすることになります このような事態を防ぐため 通常は PP から OS のデータを参照したり書き換えたりすることはできないような仕組みになっています 無理に参照したり書き換えたりすると アドレス例外 とか プロテクト例外 で PP が止まる仕組みになっています とはいうものの PP から OS のデータを参照したり書き換えたりすることが必要になる場合があります このようなときは PP から直接 OS を参照したり書き換えたりしないで OS 側で用意されたルーチンに処理を依頼することにしています いってみれば 素人がするのではなく プロに依頼する のです この OS 側で用意された ルーチン のことを スーパーバイザー といいます 1 実際は 同時 に動いているわけではなく 非常に短時間で切り替わっているので 同時に感じられるだけです なお PP が動いているときを PP モード OS が動いているときを スーパーバイザーモード といいます - 28-

29 通常 スーパーバイザーはたくさんの種類があり たとえば タイマーをセットする とか 排他制御をする とかの仕事の種類により 番号が付けられています そして このようにスーパーバイザーを呼び出す ( 仕事を依頼する ) ことを スーパーバイザー コール と言っているのです また スーパーバイザーに仕事を頼んで スーパーバイザーがそれを実行する ことを 割出し といいます CASLⅡではスーパーバイザー コール (SVC 命令 ) では パラメータに実行アドレスを指定することになっており この 実効アドレス は 引数 であるとしています 引数 ( パラメータ ) というのは スーパーバイザーの種類 依頼する仕事に必要な変数などを指しますが 具体的には定義されていません スーパーバイザー自体についても何も書かれていませんので おそらくこの命令を使用することは無いと思われます 割出割出し と 割込割込み この説明書では 割出し という言葉が使われていますが 割込み という言葉を遣う場合も多いようです どちらも interrupt の訳語と思われます 出し と 込み は意味がまったく反対ですが 微妙に似たところもあります たとえば PC から MO などにデータを書く場合 何と言うでしょうか 通常は 書き込む といいますが PC から見て 書き出す ということもあります 似たような言葉で 時間を示す 前 という言葉があります 通常 前 といえば過去のことですが なんとなく 未来 についても使いそうではないですか NOP 命令 No OPeration 命令で 名前のとおり 何もしない 命令です ノップ と発音します 通常はジャンプ命令の特別な形 ( 次の命令へジャンプする ) として定義される場合が多いのですが CASLⅡでは特別に NOP を定義しているようです この命令はいったい何に使用するのでしょうか いくつか例をあげてみます NOP 命令にラベルラベルをつける 3 章で説明しますが CASLⅡではひとつの命令は 1 行に書かなければならず 複数の行に分けて書くことができません たとえば 次のように書きます LABEL1 ADDA ST GR1,TEATE GR1,GOUKEI 1 行目は次のように書くとエラーになります LABEL1 ADDA ; ラベルのみはエラーです GR1,TEATE - 29-

30 ここで 最初の命令の前に命令をひとつ挿入する必要が生じたとします たとえば 次のように修正する場合です LABEL1 LD ADDA ST GR1,GOUKEI GR1,TEATE GR1,GOUKEI この場合 2 行修正しなければなりません では 次のようにコーディングしてあればどうでしょうか LABEL1 NOP ADDA ST GR1,TEATE GR1,GOUKEI 1 行追加する場合は LABEL1 NOP LD ADDA ST GR1,GOUKEI GR1,TEATE GR1,GOUKEI とすればよく 修正は 1 行ですみます ラベルのついた命令を削除する場合も同じですね IBM のアセンブラでは EQU という命令があります この命令 ( 実行命令ではありませんが ) は いろいろ使い方がありますが ラベルのみの行をコーディ ングする手段としても使用されます たとえば LABEL1 EQU * AH 1,TEATE これに 1 行追加するのは簡単ですね LABEL1 EQU * LH 1,GOUKEI AH 1,TEATE CASLⅡ にはこのような命令が無いので NOP で代用しようというわけです 命令を変更変更する 5 章で説明しますが 実行時に命令を作り出すために使用します 実行時まで処理が決まらない場合 とりあえず NOP として 命令の領域を確保しておき 実行時に 命令を作り出して これを実行するのです 実行時に命令を作るアセンブラならでは 1 ですね 1 REXX などでも可能です - 30-

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

主記憶の使われ方 システム領域 SP スタックポインタ システム用 スタック用 プログラム起動時に OS によって確 保される (SP が決められる ) プログラム用 メインルーチン プログラム領域 命令コードの列定数 変数用領域サブルーチン命令コードの列 先頭番地は リンク時に OS によって決め Copyright 守屋悦朗 2005 コンピュータの仕組み (2) ソフトウェア 3.3 アセンブラプログラミング (CASLⅡ) 情報処理技術者試験基本情報技術者試験 (http://www.jitec.jp/index.html) では 仮想コンピュータ (16ビットのワードマシン 主記憶容量 64KW)COMETⅡを定義し COMETⅡ のためのアセンブリ言語 CASLⅡを定めている COMETⅡとCASLⅡの仕様は情報処理技術者試験センターのウェブサイト

More information

CASL入門

CASL入門 4 章 機械語の設計 ここでは 機械語の設計をしてみましょう 機械語の設計! そんなことができるのでしょうか 情報処理技術者試験の CASLⅡ 説明書の参考資料には 命令後の構成は定義しないが と記載されています アセンブラ言語を理解するためには機械語の理解が非常に大切になりますし 自分で設計してみれば格段に理解が容易になります そこで 定義されていないなら 定義してしまおう というわけです CASLⅡが動くコンピュータである

More information

CASL入門

CASL入門 3 章 アセンブラ言語 CASLⅡ の仕様 ここでは アセンブラ言語の説明をします ちょっと待て 第 2 章の話は アセンブラ言語の話ではなかったのか と思われた人はいませんでしょうか 一般に プログラム という場合 その構成要素は次の 3 つに分かれます 1 動作のための命令加算 減算 比較などの命令 2 領域確保や定数定義など 動作しない部分 3 プログラム名の定義などこのうち 1が第 3 章で説明した部分にあたります

More information

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1 COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1 ここでは機械命令レベルプログラミングを学びます 機械命令の形式は学びましたね機械命令を並べたプログラムを作ります 2 その前に プログラミング言語について 4 プログラミング言語について 高級言語 (Java とか C とか ) と機械命令レベルの言語 ( アセンブリ言語 ) があります 5 プログラミング言語について

More information

コンピュータ工学Ⅰ

コンピュータ工学Ⅰ コンピュータ工学 Ⅰ 中央処理装置 Rev. 2019.01.16 コンピュータの基本構成と CPU 内容 ➊ CPUの構成要素 ➋ 命令サイクル ➌ アセンブリ言語 ➍ アドレッシング方式 ➎ CPUの高速化 ➏ CPUの性能評価 コンピュータの構成装置 中央処理装置 (CPU) 主記憶装置から命令を読み込み 実行を行う 主記憶装置 CPU で実行するプログラム ( 命令の集合 ) やデータを記憶する

More information

コンピュータ工学Ⅰ

コンピュータ工学Ⅰ コンピュータ工学 Ⅰ Rev. 2018.01.20 コンピュータの基本構成と CPU 内容 ➊ CPUの構成要素 ➋ 命令サイクル ➌ アセンブリ言語 ➍ アドレッシング方式 ➎ CPUの高速化 ➏ CPUの性能評価 コンピュータの構成装置 中央処理装置 (CPU) 主記憶装置から命令を読み込み 実行を行う 主記憶装置 CPU で実行するプログラム ( 命令の集合 ) やデータを記憶する 補助記憶装置

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション コンピュータアーキテクチャ 第 7 週命令セットアーキテクチャ ( 命令の表現 命令の実行の仕組 ) 2013 年 11 月 6 日 金岡晃 授業計画 第 1 週 (9/25) 第 2 週 (10/2) 第 3 週 (10/9) 第 4 週 (10/16) 第 5 週 (10/23) 第 6 週 (10/30) 第 7 週 (11/6) 授業概要 2 進数表現 論理回路の復習 2 進演算 ( 数の表現

More information

Microsoft Word - VBA基礎(6).docx

Microsoft Word - VBA基礎(6).docx あるクラスの算数の平均点と理科の平均点を読み込み 総点を計算するプログラムを考えてみましょう 一クラスだけ読み込む場合は test50 のようなプログラムになります プログラムの流れとしては非常に簡単です Sub test50() a = InputBox(" バナナ組の算数の平均点を入力してください ") b = InputBox(" バナナ組の理科の平均点を入力してください ") MsgBox

More information

Microsoft PowerPoint - ProcML-12-3.ppt

Microsoft PowerPoint - ProcML-12-3.ppt プロセッサと 年次前次前期 ( 第 回 ) 進数の加減算 (overflow( overflow) 演習 次の ビット演算の結果は overflow か? () + + () + + 答 答 中島克人 情報メディア学科 nakajima@im.dendai.ac.jp () - = + + 答 進数の加減算 (overflow( overflow) 演習 次の ビット演算の結果は overflow

More information

main.dvi

main.dvi 20 II 7. 1 409, 3255 e-mail: namba@faculty.chiba-u.jp 2 1 1 1 4 2 203 2 1 1 1 5 503 1 3 1 2 2 Web http://www.icsd2.tj.chiba-u.jp/~namba/lecture/ 1 2 1 5 501 1,, \,", 2000 7. : 1 1 CPU CPU 1 Intel Pentium

More information

スライド 1

スライド 1 東北大学工学部機械知能 航空工学科 2015 年度 5 セメスター クラス D 計算機工学 6. MIPS の命令と動作 演算 ロード ストア ( 教科書 6.3 節,6.4 節 ) 大学院情報科学研究科鏡慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/ レジスタ間の演算命令 (C 言語 ) c = a + b; ( 疑似的な MIPS アセンブリ言語 )

More information

ex04_2012.ppt

ex04_2012.ppt 2012 年度計算機システム演習第 4 回 2012.05.07 第 2 回課題の補足 } TSUBAMEへのログイン } TSUBAMEは学内からのログインはパスワードで可能 } } } } しかし 演習室ではパスワードでログインできない設定 } 公開鍵認証でログイン 公開鍵, 秘密鍵の生成 } ターミナルを開く } $ ssh-keygen } Enter file in which to save

More information

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB) コンピュータ工学講義プリント (12 月 11 日 ) 今回は ローテイト命令を用いて 前回よりも高度な LED の制御を行う 光が流れるプログラム 片道バージョン( 教科書 P.119 参照 ) 0.5 秒ごとに 教科書 P.119 の図 5.23 の様に LED の点灯パターンが変化するプログラムを作成する事を考える この様にすれば 光っている点が 徐々に右に動いているように見え 右端まで移動したら

More information

ex05_2012.pptx

ex05_2012.pptx 2012 年度計算機システム演習第 5 回 2012.05.25 高水準言語 (C 言語 ) アセンブリ言語 (MIPS) 機械語 (MIPS) コンパイラ アセンブラ 今日の内容 サブルーチンの実装 Outline } ジャンプ 分岐命令 } j, jr, jal } レジスタ衝突 回避 } caller-save } callee-save 分岐命令 ( 復習 ) } j label } Jump

More information

計算機アーキテクチャ

計算機アーキテクチャ 計算機アーキテクチャ 第 11 回命令実行の流れ 2014 年 6 月 20 日 電気情報工学科 田島孝治 1 授業スケジュール ( 前期 ) 2 回日付タイトル 1 4/7 コンピュータ技術の歴史と コンピュータアーキテクチャ 2 4/14 ノイマン型コンピュータ 3 4/21 コンピュータのハードウェア 4 4/28 数と文字の表現 5 5/12 固定小数点数と浮動小数点表現 6 5/19 計算アーキテクチャ

More information

ソフトウェア基礎技術研修

ソフトウェア基礎技術研修 算術論理演算ユニットの設計 ( 教科書 4.5 節 ) yi = fi (x, x2, x3,..., xm) (for i n) 基本的な組合せ論理回路 : インバータ,AND ゲート,OR ゲート, y n 組合せ論理回路 ( 復習 ) 組合せ論理回路 : 出力値が入力値のみの関数となっている論理回路. 論理関数 f: {, } m {, } n を実現.( フィードバック ループや記憶回路を含まない

More information

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

書式に示すように表示したい文字列をダブルクォーテーション () の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf( 情報処理基礎 ); printf(c 言語の練習 ); printf 情報処理基礎 C 言語についてプログラミング言語は 1950 年以前の機械語 アセンブリ言語 ( アセンブラ ) の開発を始めとして 現在までに非常に多くの言語が開発 発表された 情報処理基礎で習う C 言語は 1972 年にアメリカの AT&T ベル研究所でオペレーションシステムである UNIX を作成するために開発された C 言語は現在使われている多数のプログラミング言語に大きな影響を与えている

More information

改訂履歴 Ver 年 ( 平成 30 年 )5 月 25 日ページ変更点 1 試験問題に出題する Java の変更 (Third Edition から Java SE 8 Edition に変更 ) Ver 年 ( 平成 28 年 )10 月 21 日ページ変更点

改訂履歴 Ver 年 ( 平成 30 年 )5 月 25 日ページ変更点 1 試験問題に出題する Java の変更 (Third Edition から Java SE 8 Edition に変更 ) Ver 年 ( 平成 28 年 )10 月 21 日ページ変更点 情報処理技術者試験情報処理安全確保支援士試験 試験で使用する情報技術に関する用語 プログラム言語など Ver.3.1 1. 情報技術に関する用語... 1 2. 記号 図など... 1 3. プログラム言語... 1 4. データベース言語... 1 5. マーク付け言語 ( マークアップ言語 )... 1 6. 表計算ソフトなどのソフトウェアパッケージ... 2 別紙 1 アセンブラ言語の仕様...

More information

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c 第 11 回機械語とアーキテクチャ コンピュータは, 記号で組み立てられ, 記号で動く機械 : ソフトウェアソフトウェア としても理解されなければならない ソフトウェアの最も下位レベルのしくみが ( 命令セット ) アーキテクチャ である 講義では命令符号 ( 機械語 ) の構成と種類についてまとめる また, 機械語を効率良く実行するために採用されている技術について紹介する 機械語とアセンブリ言語

More information

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - 11.pptx ポインタと配列 ポインタと配列 配列を関数に渡す 法 課題 : 配列によるスタックの実現 ポインタと配列 (1/2) a が配列であるとき, 変数の場合と同様に, &a[0] [] の値は配列要素 a[0] のアドレス. C 言語では, 配列は主記憶上の連続領域に割り当てられるようになっていて, 配列名 a はその配列に割り当てられた領域の先頭番地となる. したがって,&a[0] と a は同じ値.

More information

マウス操作だけで本格プログラミングを - 世界のナベアツをコンピュータで - プログラムというと普通は英語みたいな言葉で作ることになりますが 今回はマウスの操作だけで作ってみます Baltie, SGP System 操作説明ビデオなどは 高校 情

マウス操作だけで本格プログラミングを - 世界のナベアツをコンピュータで - プログラムというと普通は英語みたいな言葉で作ることになりますが 今回はマウスの操作だけで作ってみます Baltie, SGP System   操作説明ビデオなどは 高校 情 マウス操作だけで本格プログラミングを - 世界のナベアツをコンピュータで - プログラムというと普通は英語みたいな言葉で作ることになりますが 今回はマウスの操作だけで作ってみます Baltie, SGP System http://www.sgpsys.com/en/ 操作説明ビデオなどは 高校 情報科 の教材 指導案作ってみました http://www.beyondbb.jp/ Zip の教材内に入っています

More information

スライド 1

スライド 1 東北大学工学部機械知能 航空工学科 2019 年度クラス C D 情報科学基礎 I 6. MIPS の命令と動作 演算 ロード ストア ( 教科書 6.3 節,6.4 節命令一覧は p.113) 大学院情報科学研究科 鏡慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/ レジスタ間の演算命令 (C 言語 ) c = a + b; ( 疑似的な MIPS アセンブリ言語

More information

JavaプログラミングⅠ

JavaプログラミングⅠ Java プログラミング Ⅰ 5 回目演算子の優先順位と変数の型変換 今日の講義で学ぶ内容 演算子の優先順位 優先順位の変更の方法 キャスト演算子と型変換 演算子の優先順位 演算子の優先順位 式を計算するときの演算の順序です例えば a=b*c+d; では乗算を先に計算するというルールです ( 主な演算子の優先順位 ) 演算子 名前 結合規則 ++ 後置インクリメント 左 -- 後置デクリメント 左!

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション コンピュータアーキテクチャ 第 13 週 割込みアーキテクチャ 2013 年 12 月 18 日 金岡晃 授業計画 第 1 週 (9/25) 第 2 週 (10/2) 第 3 週 (10/9) 第 4 週 (10/16) 第 5 週 (10/23) 第 6 週 (10/30) 第 7 週 (11/6) 授業概要 2 進数表現 論理回路の復習 2 進演算 ( 数の表現 ) 演算アーキテクチャ ( 演算アルゴリズムと回路

More information

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和 入出力処理 三池克明 関数 printf() と新たに学ぶ関数 scanf() を使ってデータの入出力処理を解説します 特に scanf() は対話式プログラム ( ユーザーに操作を促すプログラム ) を作るうえで重要です 目次 1. 関数 scanf()... 1 1.1. 2 整数の和を求める...1 1.2. 入力した文字を得る...3 2. 入出力処理と計算... 4 2.1. 2 整数の商を求める...4

More information

Microsoft Word - no103.docx

Microsoft Word - no103.docx 次は 数える例です ex19.c /* Zeller の公式によって 1 日の曜日の分布を求めるプログラム */ int year, month, c, y, m, wnumber, count[7] = {0, i; for(year = 2001; year

More information

JavaプログラミングⅠ

JavaプログラミングⅠ Java プログラミング Ⅰ 4 回目演算子 今日の講義で学ぶ内容 演算子とオペランド 式 様々な演算子 代表的な演算子の使用例 演算子とオペランド 演算子 演算の種類です例えば + - * / 掛け算の記号は ではなく *( アスタリスク ) を使います割り算の記号は ではなく /( スラッシュ ) を使います オペランド 演算の対象です例えば 5( 値 ) num( 変数 ) 式 演算子とオペランドの組み合わせにより構成される数式です式は演算結果をもちます

More information

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき

More information

Microsoft PowerPoint ppt

Microsoft PowerPoint ppt 仮想マシン (2), コード生成 http://cis.k.hosei.ac.jp/~asasaki /lect/compiler/2007-1204.pdf ( 訂正版 ) 1 概要 仮想マシン 概要 ( 復習 ) 制御命令 出力命令 コード生成 式のコード生成 文 文の列のコード生成 記号表 2 演習で作るコンパイラの例 test.hcc Int main() { int i j; i = 3;

More information

プログラミング実習I

プログラミング実習I プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,

More information

Microsoft Word - no11.docx

Microsoft Word - no11.docx 3. 関数 3.1 関数関数は数学の関数と同じようなイメージを持つと良いでしょう 例えば三角関数の様に一つの実数値 ( 角度 ) から値を求めますし 対数関数の様に二つの値から一つの値を出すものもあるでしょう これをイメージしてもらえば結構です つまり 何らかの値を渡し それをもとに何かの作業や計算を行い その結果を返すのが関数です C 言語の関数も基本は同じです 0 cos 1 cos(0) =

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 2018/10/05 竹島研究室創成課題 第 2 回 C 言語演習 変数と演算 東京工科大学 加納徹 前回の復習 Hello, world! と表示するプログラム 1 #include 2 3 int main(void) { 4 printf("hello, world! n"); 5 return 0; 6 } 2 プログラム実行の流れ 1. 作業ディレクトリへの移動 $ cd

More information

Microsoft Word - VBA基礎(3).docx

Microsoft Word - VBA基礎(3).docx 上に中和滴定のフローチャートを示しました この中で溶液の色を判断する部分があります このような判断はプログラムではどのように行うのでしょうか 判断に使う命令は IF 文を使います IF は英語で もし何々なら という意味になります 条件判断条件判断には次の命令を使います If 条件式 1 Then ElseIf 条件式 2 Then ElseIf 条件式 3 Then 実行文群 1 実行文群 2 実行文群

More information

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - kougi7.ppt 到達目標 スーパバイザモード, 特権命令, 割り込み CPU の割り込みメカニズム 割り込みの種類ごとに, 所定の例外処理が呼び出される スーパーバイザモードに, 自動的に切り替わる 割り込み終了後に 元のモード に戻る ハードウエア割り込みについて 割り込み禁止 割り込み発生時の CPU の挙動 現在の処理を中断 例外処理用のプログラム ( ハンドラともいう ) が起動される プログラム実行の流れ

More information

ポインタ変数

ポインタ変数 プログラミング及び実習 5 馬青 1 文字処理 数値処理 : 整数 浮動小数点数 単一の文字は と ( シングルクォーテーション ) で囲んで表現される 文字のデータ型は char または int である int を用いたほうが ライブラリの関数の引数の型と一致する 以下は全部 int の使用に統一する 従って int ch; で文字変数を宣言しておくと ch= A ; のように ch に文字 A

More information

CプログラミングI

CプログラミングI C プログラミング I Swap 関数を作る Stack データ構造のための準備 整数変数 x と y の値を取り替える関数 swap を作る 最初の試み : swap-01.c #include void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; int main(void) { int x=10, y=30;

More information

フローチャートの書き方 プログラムの開始と終わり 処理の流れの表記 ( アルゴリズム ) 逐次型 ( 直線型 ) 分岐型 ( 開始 ) 処理 1 条件 条件 処理 2 の処理 の処理 の処理 ( 終了 ) 処理 3 プログラムや人間の判断などのアルゴリズムは基本的に 逐次型 分岐型 ループ型の組み合

フローチャートの書き方 プログラムの開始と終わり 処理の流れの表記 ( アルゴリズム ) 逐次型 ( 直線型 ) 分岐型 ( 開始 ) 処理 1 条件 条件 処理 2 の処理 の処理 の処理 ( 終了 ) 処理 3 プログラムや人間の判断などのアルゴリズムは基本的に 逐次型 分岐型 ループ型の組み合 自動販売機をプログラミングする - フローチャートやいろいろな設計 - 自動販売機って どこにでもあって便利だよね 自動販売機も中に入っているコンピュータで動作しています 今回の授業では どのようなプログラムが動いているか考えてみましょう 今回は Scratch で自動販売機のプログラムを作って プログラムはどのように設計するか見ていきましょう プログラムなどは 高校 情報科 の教材 指導案作ってみました

More information

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n を入力してもらい その後 1 から n までの全ての整数の合計 sum を計算し 最後にその sum

More information

Microsoft PowerPoint ppt

Microsoft PowerPoint ppt 仮想マシン () 仮想マシン 復習 仮想マシンの概要 hsm 仮想マシン プログラム言語の処理系 ( コンパイラ ) 原始プログラム (Source program) コンパイラ (Compiler) 目的プログラム (Object code) 原始言語 (Source language) 解析 合成 目的言語 (Object Language) コンパイルする / 翻訳する (to compile

More information

Microsoft PowerPoint - OS07.pptx

Microsoft PowerPoint - OS07.pptx この資料は 情報工学レクチャーシリーズ松尾啓志著 ( 森北出版株式会社 ) を用いて授業を行うために 名古屋工業大学松尾啓志 津邑公暁が作成しました 主記憶管理 主記憶管理基礎 パワーポイント 27 で最終版として保存しているため 変更はできませんが 授業でお使いなる場合は松尾 (matsuo@nitech.ac.jp) まで連絡いただければ 編集可能なバージョンをお渡しする事も可能です 復習 OS

More information

Microsoft Word - no02.doc

Microsoft Word - no02.doc 使い方 1ソースプログラムの入力今回の講義では C++ 言語用の統合環境ソフトといわれるプログラムを利用します デスクトップにある CPad for C++ のアイコン ( 右参照 ) をダブルクリ ックしましょう ( 同じアイコンで Java_pad とかい エディタ部 てあるものもありますので気をつけてください ) これで 起 動します 統合環境を立ち上げると エディタ部とメッセージ部をもった画面が出てきます

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション コンパイラとプログラミング言語 第 11 週 条件分岐文と繰り返し文のコード生成 2014 年 6 月 18 日 金岡晃 授業計画 第 1 週 (4/9) コンパイラの概要 第 8 週 (5/28) 下向き構文解析 / 構文解析プログラム 第 2 週 (4/16) コンパイラの構成 第 9 週 (6/4) 中間表現と意味解析 第 3 週 (4/23) プログラミング言語の形式的な記述 第 10 週

More information

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く 変数 入出力 演算子ここまでに C 言語プログラミングの様子を知ってもらうため printf 文 変数 scanf 文 if 文を使った簡単なプログラムを紹介した 今回は変数の詳細について習い それに併せて使い方が増える入出力処理の方法を習う また 演算子についての復習と供に新しい演算子を紹介する 変数の宣言プログラムでデータを取り扱う場合には対象となるデータを保存する必要がでてくる このデータを保存する場所のことを

More information

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt 計算機言語第 7 回 長宗高樹 目的 関数について理解する. 入力 X 関数 f 出力 Y Y=f(X) 関数の例 関数の型 #include int tasu(int a, int b); main(void) int x1, x2, y; x1 = 2; x2 = 3; y = tasu(x1,x2); 実引数 printf( %d + %d = %d, x1, x2, y);

More information

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド メソッド ( 教科書第 7 章 p.221~p.239) ここまでには文字列を表示する System.out.print() やキーボードから整数を入力する stdin.nextint() などを用いてプログラムを作成してきた これらはメソッドと呼ばれるプログラムを構成する部品である メソッドとは Java や C++ などのオブジェクト指向プログラミング言語で利用されている概念であり 他の言語での関数やサブルーチンに相当するが

More information

Microsoft Word - 3new.doc

Microsoft Word - 3new.doc プログラミング演習 II 講義資料 3 ポインタ I - ポインタの基礎 1 ポインタとは ポインタとはポインタは, アドレス ( データが格納されている場所 ) を扱うデータ型です つまり, アドレスを通してデータを間接的に処理します ポインタを使用する場合の, 処理の手順は以下のようになります 1 ポインタ変数を宣言する 2 ポインタ変数へアドレスを割り当てる 3 ポインタ変数を用いて処理 (

More information

Microsoft PowerPoint - 7.Arithmetic.ppt

Microsoft PowerPoint - 7.Arithmetic.ppt 第 7 章デジタル演算回路 1 デジタル信号処理音声, 音楽, 通信信号 信号 = 符号付き 2 進データ 負の数値の表現方法 2 2 進数 n ビット n-1 =Σb i 2 i 0 2 の補数 +=2 n n-1 n-1 2 n =1+Σb i 2 i +Σb i 2 i 0 0 n-1 =2 n ー =1+Σb i 2 i 0 3 2 進数の補数 2 の補数 各桁のビットを反転した後で最下位に

More information

模擬試験問題(第1章~第3章)

模擬試験問題(第1章~第3章) 基本情報技術者試験の練習問題 - 第 8 回 この問題は平成 19 年度秋期の問題から抜粋しています 問 1 次のプログラムの説明及びプログラムを読んで, 設問 1,2 に答えよ プログラムの説明 スタックを使って, 実数値を 10 進数字列 ( 文字列 ) に変換する副プログラム FloatFormat である (1) FloatFormat は, 実数 Float の値を 10 進数字列に変換し,

More information

プログラミング実習I

プログラミング実習I プログラミング実習 I 03 変数と式 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp 3.1 変数と型 変数とは p.60 C 言語のプログラム中で, 入力あるいは計算された数や文字を保持するには, 変数を使用する. 名前がついていて値を入れられる箱, というイメージ. 変数定義 : 変数は変数定義 ( 宣言 ) してからでないと使うことはできない. 代入 : 変数には値を代入できる.

More information

メソッドのまとめ

メソッドのまとめ メソッド (4) 擬似コードテスト技法 http://java.cis.k.hosei.ac.jp/ 授業の前に自己点検以下のことがらを友達に説明できますか? メソッドの宣言とは 起動とは何ですか メソッドの宣言はどのように書きますか メソッドの宣言はどこに置きますか メソッドの起動はどのようにしますか メソッドの仮引数 実引数 戻り値とは何ですか メソッドの起動にあたって実引数はどのようにして仮引数に渡されますか

More information

1 はじめに このアプリケーションは 計算機ハードウェア論 のアセンブリ言語 ( 超簡単命令セット ) の理解を助けるために製作されました 便宜的に機能を追加 削除した箇所があるため このアプリケーション上での動き方が実際のCPUでの動き方と異なる場合があることに留意してください このアプリケーショ

1 はじめに このアプリケーションは 計算機ハードウェア論 のアセンブリ言語 ( 超簡単命令セット ) の理解を助けるために製作されました 便宜的に機能を追加 削除した箇所があるため このアプリケーション上での動き方が実際のCPUでの動き方と異なる場合があることに留意してください このアプリケーショ アセンブリ言語 ( 超簡単命令セット版 ) 取扱説明書 平成 26 年 2 月改訂版 目次 1 はじめに 2 1.1 利用できるデータの範囲やアドレス空間 命令長についての注意 2 2 プログラムの書き方と実行の方法 3 2.1 このマニュアルでの表記について 3 2.2 入力上の注意 3 2.2.1 使用できる文字について 3 2.2.2 ラベルの付け方 3 2.3 命令長の書き方 4 2.3.1

More information

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の 4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の組み合わせで作れる. ここでは (2) と (3) について扱う. 4.1 分岐処理 4.1.1 if

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション ようこそ COBOL へ! 2018/08/17 伊東 輝 COBOL とは? 1959 年に事務処理用に開発された手続き型言語であり ソースコードの記述内容を上から順番に実行する言語である 約 60 年前から存在する言語でありながら 未だに基本情報処理技術者の午後試験に出題され 金融系システム等のレガシーシステムでは現在も COBOL のプログラムが稼働している 今回は COBOL のコーディングの基礎を発表する

More information

kantan_C_1_iro3.indd

kantan_C_1_iro3.indd 1 章 C# の学習を始める前に プログラムの 01 基本 Keyword プログラムプログラミング言語 プログラムとは プログラムとは コンピューターへの命令の集まりです 学校の先生が プリントを持ってきて と生徒に指示した場合を考えてみましょう 先生をプログラマー ( プログラムの作成者 ) 生徒をコンピューターとしたとき プリントを持ってきて という指示がプログラムです 人間とは違い コンピューターは曖昧な指示を理解できません

More information

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - prog03.ppt プログラミング言語 2 第 03 回 (2007 年 05 月 07 日 ) 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 1 今日やること hp://www.nlab.ice.uec.ac.jp/~s-okubo/class/language/ にアクセスすると 教材があります 2007 年 05 月 07 日分と書いてある部分が 本日の教材です 本日の内容

More information

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - 09.pptx 情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源

More information

Microsoft PowerPoint - 11Web.pptx

Microsoft PowerPoint - 11Web.pptx 計算機システムの基礎 ( 第 10 回配布 ) 第 7 章 2 節コンピュータの性能の推移 (1) コンピュータの歴史 (2) コンピュータの性能 (3) 集積回路の進歩 (4) アーキテクチャ 第 4 章プロセッサ (1) プロセッサの基本機能 (2) プロセッサの構成回路 (3) コンピュータアーキテクチャ 第 5 章メモリアーキテクチャ 1. コンピュータの世代 計算する機械 解析機関 by

More information

1.1 ラベル ラベルはカラム 1 から始まらなければならない ラベルの後にはコロン スペース タブ 改行が続いてよい ラベルはアルファベットかアンダーバーで始まり 英数字 アンダーバー クエスチョンマークを含んでよい ラベルは 32 文字までである デフォルトではこれらは大文字と小文字を区別するが

1.1 ラベル ラベルはカラム 1 から始まらなければならない ラベルの後にはコロン スペース タブ 改行が続いてよい ラベルはアルファベットかアンダーバーで始まり 英数字 アンダーバー クエスチョンマークを含んでよい ラベルは 32 文字までである デフォルトではこれらは大文字と小文字を区別するが MPASM MPASM は Microchip Tecnology Inc. 社の開発した PIC のためのアセンブリ言語である ここでは MPASM の文法と使用法などについて記述する 1. 文法 ソースコードファイルは ASCII テキストファイルエディターを使って作成する そのように作られたソースコードは以下に示す基本的ガイドラインに従うべきである ソースファイルの各行は次の 4 つのタイプの情報を含んでよい

More information

Microsoft Word - CygwinでPython.docx

Microsoft Word - CygwinでPython.docx Cygwin でプログラミング 2018/4/9 千葉 数値計算は計算プログラムを書いて行うわけですが プログラムには様々な 言語 があるので そのうちどれかを選択する必要があります プログラム言語には 人間が書いたプログラムを一度計算機用に翻訳したのち計算を実行するものと 人間が書いたプログラムを計算機が読んでそのまま実行するものとがあります ( 若干不正確な説明ですが ) 前者を システム言語

More information

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

コンピュータ中級B ~Javaプログラミング~  第3回 コンピュータと情報をやりとりするには? Copyright (C) Junko Shirogane, Tokyo Woman's Christian University 2012, All rights reserved. 1 コンピュータ サイエンス 2 第 7 回ソフトウェア 人間科学科コミュニケーション専攻 白銀純子 Copyright (C) Junko Shirogane, Tokyo Woman's Christian University

More information

ディジタル回路 第1回 ガイダンス、CMOSの基本回路

ディジタル回路 第1回 ガイダンス、CMOSの基本回路 1 前回教育用の RISC POCO を導入しました 今日はその Verilog 記述を紹介します まず この復習をやっておきましょう 2 最も重要な点は メモリの読み書きで レジスタ間接指定の理解です これはポインタと一緒なので 間違えないように修得してください 3 RISC なので 基本の演算はレジスタ同士でしかできません MV はレジスタ間のデータ移動なので気をつけてください 4 イミーディエイト命令は

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 講座を行う前に 自己紹介 僕と上回生について 1 年生同士で少しお話しよう! オリエンテーションの宿題 アルゴロジック http://home.jeita.or.jp/is/highschool/algo/index3.html どこまでできましたか? あまりできなかった人はこれから全部クリアしよう! 2016 年度 C 言語講座 第一回目 2016/6/11 fumi 今回の目標 プログラムを書いて実行するやり方を覚える

More information

授業のあとで 情報処理工学 : 第 3 回 10 進数を 16 進数に変換する方法と 16 進数を 10 進数に変換する方法は 標準的な方法でも良いですか? 履修申告は済みましたか? 割り算 方法 ) 54 余り 6 16 ) 3 余り 3 ) 0 第 4 回へ 201

授業のあとで 情報処理工学 : 第 3 回 10 進数を 16 進数に変換する方法と 16 進数を 10 進数に変換する方法は 標準的な方法でも良いですか? 履修申告は済みましたか? 割り算 方法 ) 54 余り 6 16 ) 3 余り 3 ) 0 第 4 回へ 201 授業のあとで 情報処理工学 : 第 3 回 10 進数を 16 進数に変換する方法と 16 進数を 10 進数に変換する方法は 標準的な方法でも良いですか? 履修申告は済みましたか? 割り算 方法 54 10 36 16 16 ) 54 余り 6 16 ) 3 余り 3 ) 0 第 4 回へ 2013/10/30 2 授業のあとで (#2) したがって 54 10 36 16 ここまでの復習 2/10/16

More information

sinfI2005_VBA.doc

sinfI2005_VBA.doc sinfi2005_vba.doc MS-ExcelVBA 基礎 (Visual Basic for Application). 主な仕様一覧 () データ型 主なもの 型 型名 型宣言文字 長さ 内容 整数型 Integer % 2 バイト -32,768 32,767 長整数型 Long & 4 バイト -2,47,483,648 2,47,483,647 単精度浮動小数点数 Single 型!

More information

スライド 1

スライド 1 プログラミング 第 3 週 静岡大学工学部機械工学科知能 材料コースロボット 計測情報分野臼杵深光電 精密コース光ナノバイオ分野居波渉 講義の前に 講義資料や演習課題 LiveCampusよりダウンロード可能 成績評価期末試験および課題により行う. 評価の配分は, おおむね試験 90%, 課題 10% である. 再試験期末試験で40 点以上 60 点未満の場合, 再試験となる. 2 月 26 日 (

More information

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx 情報ネットワーク導入ユニット Ⅰ C 言語 配列 5 章 : 配列同じ型 (int, double など ) の変数の集まりを 番号 ( 添字 ) で管理する変数 int vc[5]; // 要素数が 5 の配列 vc[0] = 1; vc[1] = 2; vc[2] = 3; vc[3] = 4; vc[4] = 5; printf("vc[0] = %d n", vc[0] ); printf("vc[1]

More information

スライド 1

スライド 1 知能制御システム学 画像処理の高速化 OpenCV による基礎的な例 東北大学大学院情報科学研究科鏡慎吾 swk(at)ic.is.tohoku.ac.jp 2007.07.03 リアルタイム処理と高速化 リアルタイム = 高速 ではない 目標となる時間制約が定められているのがリアルタイム処理である.34 ms かかった処理が 33 ms に縮んだだけでも, それによって与えられた時間制約が満たされるのであれば,

More information

スライド 1

スライド 1 東北大学工学部機械知能 航空工学科 2018 年度クラス C3 D1 D2 D3 情報科学基礎 I 10. 組合せ回路 ( 教科書 3.4~3.5 節 ) 大学院情報科学研究科 鏡慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/ 組合せ論理回路 x1 x2 xn 組合せ論理回路 y1 y2 ym y i = f i (x 1, x 2,, x n ), i

More information

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1 7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 10001 番地とすると, そこから int 型のサイズ, つまり 4 バイト分の領域が確保される.1

More information

プログラミング入門1

プログラミング入門1 プログラミング入門 1 第 5 回 繰り返し (while ループ ) 授業開始前に ログオン後 不要なファイルを削除し て待機してください Java 1 第 5 回 2 参考書について 参考書は自分にあったものをぜひ手元において自習してください 授業の WEB 教材は勉強の入り口へみなさんを案内するのが目的でつくられている これで十分という訳ではない 第 1 回に紹介した本以外にも良書がたくさんある

More information

スライド 1

スライド 1 3. 演算命令を学ぼう 本稿の Web ページ http://www.mybook-pub-site.sakura.ne.jp/pic/index.html 1 ; ADD このソースファイルを各自打ち込んで下さい. EQU 0x0C ; at 0C 足し算を実行するプログラムの例です. MOVLW B 00000001 ; Load 0x01 to W ADDLW B'00000011' ; W

More information

スライド 1

スライド 1 4. 演算命令 ( つづき ) ( 足し算の桁上がり,Rotate, etc.) を学ぼう 本稿の Web ページ http://www.cmplx.cse.nagoya-u.ac.jp/~furuhashi/education/pic/index.html 1 本章では足し算の桁上がり情報の格納場所の確認をするプログラムを学びます. PIC16F マイコンではデータは 8 ビットで表されています.

More information

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63> C 言語講座第 2 回 作成 : ハルト 前回の復習基本的に main () の中カッコの中にプログラムを書く また 変数 ( int, float ) はC 言語では main() の中カッコの先頭で宣言する 1 画面へ出力 printf() 2 キーボードから入力 scanf() printf / scanf で整数を表示 / 入力 %d 小数を表示 / 入力 %f 3 整数を扱う int 型を使う

More information

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留 第 10 章分割コンパイル 1 ソースを分割する今まで出てきたソースは全て一つのソースファイルにソースを記述してきました しかし ソースが長くなっていくと全てを一つのファイルに書くと読みづらくなります そこで ソースを複数のファイルに分割してコンパイルを行う分割コンパイルをします 今章は章名にもなっている 分割コンパイルの方法についてやります 分割コンパイルする時は大抵 関連性のある機能ごとにファイルにまとめます

More information

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){ ソフトゼミ A 第 6 回 関数 プログラムは関数の組み合わせでできています 今までのゼミAでも printf や scanf など様々な関数を使ってきましたが なんと関数は自分で作ることもできるのです!! 今日は自作関数を中心に扱っていきます ゲーム制作でも自作関数は避けては通れないので頑張りましょう そもそもまず 関数とは 基本的には 受け取った値に関数によって定められた操作をして その結果の値を返す

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション Excel VBA の基本 1 VBA Visual Basic for Applications Office シリーズに搭載されているプログラミング言語 マクロを作成するために使われる 1 プログラミングとは 人間の意図した処理を行うようにコンピュータに指示を与えること セル A1 の内容をセル B1 にコピーしなさいセル A1 の背景色を赤色にしなさいあれをしなさいこれをしなさい 上から順番に実行

More information

文字コード略歴 よこやままさふみ社内勉強会 2012/05/18 文字コード略歴 Powered by Rabbit 2.0.6

文字コード略歴 よこやままさふみ社内勉強会 2012/05/18 文字コード略歴 Powered by Rabbit 2.0.6 文字コード略歴 よこやままさふみ社内勉強会 2012/05/18 自己紹介 横山昌史 入社 4 年目 プログラマ etc... 所属プロジェクト Java UNIX 雑用 etc... 文字コードの " るつぼ " Rabbit について プレゼンテーションツール 実装 : Ruby/GTK 動作 : UNIX/Win/Mac 文章とデザインの分離 バージョン管理しやすい 文字コードとは 文字をコンピュータで扱うための符号化方式

More information

プログラミングA

プログラミングA プログラミング A 第 5 回 場合に応じた処理 繰り返し 2017 年 5 月 15 日 東邦大学金岡晃 前回の復習 (1) このプログラムを作成し実行してください 1 前回の復習 (2) このプログラムを作成し実行してください 2 前回の復習 (3) 3 前回の復習 演算子 代入演算子 インクリメント シフト演算子 型変換 4 場合に応じた処理 5 こういうプログラムを作りたい 5 教科のテスト

More information

Microsoft Word - 19-d代 試é¨fi 解ç�fl.docx

Microsoft Word - 19-d代 試é¨fi 解ç�fl.docx 2019 年度ディジタル代数期末試験解答例 再評価試験は期末試験と同程度の難しさである. しっかり準備して受けるように. 1. アドレスが 4 バイトで表わされた画像処理専用プロセッサが幾つかのデータを吐き出して停まってしまった. そのデータの 1 つはレジスタ R0 の中身で,16 進表示すると (BD80) 16 であった. このデータに関して, 以下の問に対する回答を対応する箱内に書け. (1)

More information

Microsoft Word - VBA基礎(2).docx

Microsoft Word - VBA基礎(2).docx 変数 test1 を実行してみてください 結果はメッセージボックスに 100 と表示されるはずです Sub test1() a = 10 このプルグラムでは a という文字がつかわれています MsgBox の機能はこの命令に続くものを画面に表示することで MsgBox a * a す つまり a*a を表示しています プログラムでは * は掛け算を意味しますの で画面に 100 が表示されたということは

More information

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること C プログラミング演習 1( 再 ) 4 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順

More information

プログラミングA

プログラミングA プログラミング A 第 5 回 場合に応じた処理 繰り返し 2019 年 5 月 13 日 東邦大学金岡晃 場合に応じた処理 1 こういうプログラムを作りたい 5 教科のテスト 100 点以上各科目の点数の合計が 100 点未満 おめでとう! これで 100 点越えのプレゼントを獲得! というメッセージを出力 残念!100 点越えのプレゼントまであと ** 点! というメッセージを出力 5 教科の点数の合計が

More information

Microsoft PowerPoint - 5Chap15.ppt

Microsoft PowerPoint - 5Chap15.ppt 第 15 章文字列処理 今日のポイント 15.1 文字列処理の基本 strcpy strcat strlen strchr などの使い方をマスターする strcpy はなんて読むの? 普通はストリングコピー C のキーワードの読み方に悩んだら下記サイトを参考 ( 前回紹介とは別サイト ) http://www.okakogi.go.jp/people/miwa/program/c_lang/c_furoku.html

More information

スライド 1

スライド 1 東北大学工学部機械知能 航空工学科 2019 年度クラス C D 情報科学基礎 I 7. MIPS の命令と動作 分岐 ジャンプ 関数呼出し ( 教科書 7 章命令一覧は p.113) 大学院情報科学研究科 鏡慎吾 http://www.ic.is.tohoku.ac.jp/~swk/lecture/ 分岐 ジャンプ命令 条件文や繰り返し文などを実現するには, 命令の実行順の制御が必要 (C 言語

More information

Microsoft PowerPoint - Prog05.ppt

Microsoft PowerPoint - Prog05.ppt 本日の内容 プログラミング言語第五回 担当 : 篠沢佳久櫻井彰人 平成 20 年 5 月 19 日 制御構造 条件式 論理式 ( 復習 ) if 式 繰り返し (1) 無限の繰り返し 1 2 Ruby vs. Excel 浮動小数点数の計算能力は同じ 整数の計算能力は Ruby が上 Ruby なら何桁でも計算できる Excel には 整数計算だけやって! ということができない欠点がある 使いやすさは

More information

演算増幅器

演算増幅器 ファイルこれまでにデータの入力方法として キーボードからの入力を用いてきた 構造体を習った際に実感してもらえたと思うが 入力データ量が多いときにはその作業は大変なものとなり 入力するデータを間違えた場合には最初からやり直しになる そこで今回はこれらの問題を解決するため あらかじめ入力データをテキストエディタなどで編集し ファイルとして保存したものを入力データとして用いる方法を習っていく さらにプログラムで作成したデータをファイルに出力する方法も併せて習っていく

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング初級 第 7 回 2017 年 5 月 29 日 配列 ( 復習 )~ 文字列 1 配列とは 2 配列 : 複数の変数をグループとしてまとめて扱うもの 配列 変数 int data[10]; 整数型の配列 同種のデータ型を連続して確保したものを配列とよぶ = 整数がそれぞれにひとつずつ入る箱を 10 個用意したようなもの int data; 整数型の変数 = 整数がひとつ入る dataという名前の箱を用意したようなもの

More information

プログラミング基礎

プログラミング基礎 C プログラミング Ⅰ 授業ガイダンス C 言語の概要プログラム作成 実行方法 授業内容について 授業目的 C 言語によるプログラミングの基礎を学ぶこと 学習内容 C 言語の基礎的な文法 入出力, 変数, 演算, 条件分岐, 繰り返し, 配列,( 関数 ) C 言語による簡単な計算処理プログラムの開発 到達目標 C 言語の基礎的な文法を理解する 簡単な計算処理プログラムを作成できるようにする 授業ガイダンス

More information

3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ #include <stdio.h> main() { int a, b; } pri

3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ #include <stdio.h> main() { int a, b; } pri 3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ int a, b; b = a % 3; if (b== 0) printf( %d は 3 で割り切れます n, a); if (b == 1) printf( %d を 3 で割った余りは

More information

ネットワーク工学演習 解答編 典型的な IP アドレス問題と解答を示す 解き方をよく覚えるように N 科 ある PC がある ネットワークの設定をみると IP アドレスが であり サブネットマスクは である 下記について解答せよ [1]

ネットワーク工学演習 解答編 典型的な IP アドレス問題と解答を示す 解き方をよく覚えるように N 科 ある PC がある ネットワークの設定をみると IP アドレスが であり サブネットマスクは である 下記について解答せよ [1] ネットワーク工学演習 解答編 典型的な IP アドレス問題と解答を示す 解き方をよく覚えるように N 科 ある PC がある ネットワークの設定をみると IP アドレスが 192.168.10.130 であり サブネットマスクは 255.255.255.224 である 下記について解答せよ [1] この PC が属するネットワークアドレスは何か? [2] CIDR 表記で描くと /X の X はいくつになるか

More information

<4D F736F F D2094F795AA95FB92F68EAE82CC89F082AB95FB E646F63>

<4D F736F F D2094F795AA95FB92F68EAE82CC89F082AB95FB E646F63> 力学 A 金曜 限 : 松田 微分方程式の解き方 微分方程式の解き方のところが分からなかったという声が多いので プリントにまとめます 数学的に厳密な話はしていないので 詳しくは数学の常微分方程式を扱っているテキストを参照してください また os s は既知とします. 微分方程式の分類 常微分方程式とは 独立変数 と その関数 その有限次の導関数 がみたす方程式 F,,, = のことです 次までの導関数を含む方程式を

More information

Outlook2010 の メール 連絡先 に関連する内容を解説します 注意 :Outlook2007 と Outlook2010 では 基本操作 基本画面が違うため この資料では Outlook2010 のみで参考にしてください Outlook2010 の画面構成について... 2 メールについて

Outlook2010 の メール 連絡先 に関連する内容を解説します 注意 :Outlook2007 と Outlook2010 では 基本操作 基本画面が違うため この資料では Outlook2010 のみで参考にしてください Outlook2010 の画面構成について... 2 メールについて Outlook2010 - メール 連絡先など - Outlook2010 の メール 連絡先 に関連する内容を解説します 注意 :Outlook2007 と Outlook2010 では 基本操作 基本画面が違うため この資料では Outlook2010 のみで参考にしてください Outlook2010 の画面構成について... 2 メールについて... 3 画面構成と操作... 3 人物情報ウィンドウ...

More information

- VHDL 演習 ( 組み合せ論理回路 ) 回路 半加算器 (half adder,fig.-) 全加算器を構成する要素である半加算器を作成する i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,LED, が, の出力とな

- VHDL 演習 ( 組み合せ論理回路 ) 回路 半加算器 (half adder,fig.-) 全加算器を構成する要素である半加算器を作成する i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,LED, が, の出力とな 第 回 VHDL 演習組み合せ論理回路 VHDL に関する演習を行う 今回は, 組み合せ論理回路の記述について学ぶ - 論理回路の VHDL 記述の基本 同時処理文を並べることで記述できる 部品の接続関係を記述 順番は関係ない process 文の内部では, 順次処理文を使う process 文 つで, つの同時処理文になる順次処理文は, 回路の動作を 逐次処理的 に ( 手続き処理型プログラム言語のように

More information

初めてのプログラミング

初めてのプログラミング Excel の使い方 2 ~ 数式の入力 グラフの作成 ~ 0. データ処理とグラフの作成 前回は エクセルを用いた表の作成方法について学びました 今回は エクセルを用いたデータ処理方法と グラフの作成方法について学ぶことにしましょう 1. 数式の入力 1 ここでは x, y の値を入力していきます まず 前回の講義を参考に 自動補間機能を用いて x の値を入力してみましょう 補間方法としては A2,

More information

Taro-Basicの基礎・条件分岐(公

Taro-Basicの基礎・条件分岐(公 0. 目次 3. 条件分岐 3. 1 If 文 3. 1. 1 処理を分岐する方法 3. 1. 2 処理を 2 つに分岐する方法 3. 1. 3 処理を 3 つ以上に分岐する方法 3. 2 Select Case 文 - 1 - 3. 条件分岐 条件により ある 文 を実行したりしなかったりするとき If 文を使う たとえば ある変数の値により 奇数 と表示したり 偶数 と表示したりするような処理ができる

More information

また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる

また 初期化について 以下のサンプルコードのように指定すれば 定義時に値を代入できます * オマケ配列は同名で複数個の箱を用意出来ます 同名ではありますが それぞれは別々の個体であるわけです また この複数個の変数は メモリ上に連続で確保されます 2. 文字と文字列 C 言語では文字と文字列は異なる 第 4 回 C 言語講座 1. 配列についていままで 変数は1 個ずつ指定してました が 同名で たくさん必要なときもあるかもしれませんね 例えば 複数人の点数だけを格納するときとか このときは 配列が便利なわけです それぞれを添字によって区別しながら扱えるという便利なものです というわけで サンプルコード %.2lf で小数点以下 2 桁表示を示しています定義時は個数を指定します が その後は []

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 4 回再帰的構造体 プログラミングを 余談 : 教えることの難しさ 丁寧に説明しないと分かってもらえない 説明すると 小難しくなる学生が目指すべきところプログラム例を説明されて理解できる違うやり方でも良いので自力で解決できる おっけー 動けば良い という意識でプログラミング 正しく動くことのチェックは必要 解答例と自分のやり方との比較が勉強になる 今日のお題 再帰的構造体

More information

次の病院 薬局欄は 氏名 欄に入力された値によって入力すべき値が変わります 太郎の行く病院と花子の行く病院が必ずしも同じではないからです このような違いを 設定 シートで定義しておきましょう 太郎の行く病院のリストを 太郎 花子の行く病院のリストを 花子 として 2 つのリストが定義されています こ

次の病院 薬局欄は 氏名 欄に入力された値によって入力すべき値が変わります 太郎の行く病院と花子の行く病院が必ずしも同じではないからです このような違いを 設定 シートで定義しておきましょう 太郎の行く病院のリストを 太郎 花子の行く病院のリストを 花子 として 2 つのリストが定義されています こ 医療費の入力と集計 まえがき 医療費は一年間の合計を計算し 10 万円を超えていれば税務申告に際して医療費控除を受けることができます そこで 医療費を記入するたびに自動集計される仕組みを考えてみましょう ここで紹介する 医療費の入力と集計 は 税務申告で必要となる医療費のデータを作成するのに使うものです 特徴は ドロップダウンリストから簡便に入力ができ 入力と同時に自動集計されるようにしてあることです

More information

TOPPERS活用アイデア・アプリケーション開発

TOPPERS活用アイデア・アプリケーション開発 TOPPERS 活用アイデア アプリケーション開発 コンテスト 部門 : がじぇるね IoT 部門 作品のタイトル : 初心者向け プログラムを同時に動かすとは 作成者 共同作業者 : 森脇秀樹 : 角田米弘 対象者 : GR-ガジェットを使用してプログラムを始めようとする 初心者の方々に TOPPERS(Web コンパイラ ) を使用すれば おまじないのような簡単な記述で 後で知ればよい難解な理論などを必要とせず

More information

プログラミング入門1

プログラミング入門1 プログラミング入門 1 第 8 回メソッド (2) 授業開始前に自己点検 前回までの必須課題はすべてできていますか 前回までの学習項目であいまいな所はありませんか 理解できたかどうかは自分自身の基準をもとう Java 1 第 8 回 2 前回のテーマ メソッドとは いくつかの命令の列を束ねて 一つの命令として扱えるようにしたもの 今回学ぶメソッドの役割は その他のプログラミング言語では関数またはサブルーチンと呼ばれることがある

More information