TSG 部報 第 198 号・一般記事


一般記事(別ページ)


初心者のための 8086 講座

高野

パソコンの脳味噌

 パソコンの脳味噌に当たる部分をCPU(Central Processing Unit)と言いま す。CPUは単に数値の計算を行うほか、データの読み書きや判断、入出力等の 処理を行います。現在では様々なCPUが開発されていて、有名な物としては Intel社のPentiumやモトローラ社のPower PCなどがあります。ここでは今日パ ソコンにもっとも多く使われているIntel社製のPentiumの元となった8086につ いて解説します。

 私たちはキーボードやマウスなどによってパソコンを操作しますが、これは キーボードやマウスを使うためのプログラムがあらかじめ用意してあるためで す。そのプログラムはマシン語と言われるもので書かれています。コンピュー タはそのマシン語でしか働くことができません。マシン語は普通の人間にはと てもわかりずらいので、様々なプログラムを作るときには、C言語やベーシッ クと呼ばれる人間にわかりやすい、プログラミングのための言語を使ってプロ グラミングをします。そしてそのままではコンピュータはそのプログラムを解 読することはできないので、コンパイラやインタプリタと呼ばれるマシン語変 換プログラムによってコンピュータを働かせることができます。

クロック

 CPUの処理速度を測る上で重要なファクターとなってくるのが、このクロッ クです。コンピュータはCPU以外の部品とタイミングを取るために、クロック という同期信号によってシステム全体の動作のタイミングを取っています。一 般にこのクロック周波数が高ければ高いほどそのコンピュータは高い処理能力 を発揮するわけです。また、CPUの命令はその命令ごとに実行に必要なクロッ ク数が決まっており、クロック数が少ない命令ほどその命令の負担は軽いこと になります。

2進法

 我々は物を数えるとき、10を一まとまりとして扱うことが多いのですが、コ ンピュータの世界では0と1しか存在しません。数字をすべて2進法としてあつ かっているわけです。0と1の二つの状態しか持たない情報量のことをビット (Bit)と言います。コンピュータは情報を伝えるときにはこのビットを単位と しています。つまり、信号線においては電圧の高低という二つの状態で区別さ れて情報が処理されているわけです。信号線が n 本ある時 2n 乗通りの区別が できます。その時の情報量を n ビットの情報量があるといいます。8ビットの情 報を1つの基本単位として、1バイト(Byte)と呼びます。2の8乗=1024ビット=1バイトとなります。

16進法

 このように普通マシン語は2進法で書かれているのですが、一般に我々がマ シン語を見るときこれを16進法として見ることが多いです。16進法というのは 一つの桁で0から15までの16種類の数値を表します。一桁で10から15の値も表 さなくてはならないので、AからFまでの英文字を数字として使います。たとえ ばAは10、Bは11と言う具合です。16進法であることを明確にするために後ろに 「H」(Hexadecimal notation)をつけたり「0x」を前につけたりします。

2進法と16進法

 ではなぜいちいち16進法にするのでしょうか?2進法において4ビットは0か ら15までの数を区別することができます。だから2進法では1バイトを8けた必 要なのに対し、16進法は2桁ですむわけです。たとえば2進法において10010111 は16進法では97Hと表され、非常にすっきりと見やすくなります。

10進法と2進法と16進法の対応を表にしてみます。

10進法16進法2進法
00H0000
11H0001
22H0010
33H0011
44H0100
55H0101
66H0110
77H0111
88H1000
99H1001
10AH1010
11BH1011
12CH1100
13DH1101
14EH1110
15FH1111

 16進法と2進法の相互の変換は、2進法で4桁ごとに区切って考えて、上の表 に対応させるだけなので非常に簡単です。

キロとメガ

 普通1キログラムというと1000グラムのことを指します。しかしコンピュー タにおいて1キロビットと言うと普通1024ビットのことを指します。これはコ ンピュータの場合、210 で1024、16進法で400Hと非常に区切りのいい数字 になるからです。これと同様に1メガバイトとは1000キロバイトのことではな く、1024キロバイトのことを指します。

メモリ

 CPUはデータの受け渡しを「データバス」と呼ばれる信号線をとおして行わ れます。電線がゲジゲジのICから何本も出ていることを見たことがあるでしょ う。何本かの電気信号が通る道の束と思ってくれればいいです。

 データの受け渡しが行うには、どこにデータが存在するかが、わからなくて はなりません。例えば、NHKの集金係の人がお金をもらいに行くのにも、その 人のうちの住所(アドレス)を知らなくてはお金を集めてくることができませ ん。データのアドレスを、今度は「アドレスバス」と呼ばれる信号線をとおし て、データの場所を指定してやることで、CPUは初めてデータを読み書きでき るわけです。データの場所は数字で指定されます。(もちろん2進法です。)

 データは常にメモリに記憶されています。メモリには大きく分けてROMとRAM というものがあります。前者はRead Only Memoryの略称で、その名の通り読み 込み専用のメモリです。後者はRandom Access Memoryの略称で、読み込みもで きれば書き込みもできるメモリです。ここで注意して欲しいのは、メモリはフ ロッピーディスクやハードディスクとは全く別物であると言うことです。ROM は読み込むことしかできない変わりに、パソコンの電源を切っても記憶は消え ません。一方RAMは読み書きは両方ともできるのですが、電源を切ると消えて しまいます。一般に、ROMはコンピュータに電源をいれたとき、一番はじめに 実行されるプログラムや、BIOS(Basic Input Output System)と呼ばれる基 本的な入出力を行うプログラムが納められています。RAMはCPUのユーザープロ グラムや、処理するための各種データエリアなどに使われます。

ちょっと寄り道

 RAMには大きく分けてSRAMとDRAMに分類されます。SRAMは非常に読み書きの スピードが速いのですが、構造上の問題から集積度があげにくく、一般に高価 です。DRAMは構造が非常に単純なので集積度はあげやすいのですが、そのかわ り読み書きのスピードが遅いのです。最近ではDRAMのこの欠点を解消するため に、普通のDRAMの代わりにEDORAMなどが使われ始めています。

I/O

 フロッピーディスクやハードディスクは電源を切っても内容は保存されます が、RAMやROMとは違って直接CPUに繋がっているのではなく、I/Oポートを通 してデータのやりとりを行っています。ではI/Oポートとはいったい何なので しょうか?

 I/Oとは日本最古のパソコン雑誌のことではありません。Input/Output Systemの略称、すなわち入出力装置のことです。CPUは大部分の時間をメモリ 間の処理に費やしますが、それだけでは何の結果も知ることができません。モ ニターやプリンタなどに出力することで、はじめて結果を知ることができます。 このような信号のやりとりの接点に当たる部分がI/Oポートと言います。I/O ポートには普通モニタやプリンタなどのほかに、フロッピーディスクやハード ディスクなどが接続されています。ゲームなどの音楽に使われるFM音源ボード もそうです。8086の場合、これらの周辺機器にアクセスするには、I/Oアドレ スと呼ばれるI/O専用のアドレスでアクセスします。8086は16ビットのI/Oア ドレスを持っています。メモリのアドレスとは全く別物なので混同しないよう にして下さい。(モトローラ社の68kのCPUはメモリのアドレスとI/Oのアドレ スが混在しています。)

CPUの中身はどうなっているのか

 以上で簡単にパソコンの中身の構造を簡単に説明しましたが、CPUの中身は どうなっているのでしょうか?

 CPUはバスを介してメモリにつながれていますが、このメモリとは別にCPUの 内部にもメモリが存在し、それをレジスタ(Register)とよびます。レジスタ には8ビット、16ビット、32ビットのデータを格納でできるようになっていま す。レジスタはRAMなどのメモリと違ってアドレスで区別しません。レジスタ には個別に名前が付けられており、8086系ではそのレジスタごとの役割が決め られています。(80386以上のCPUではだいぶ自由になりましたが\dots) CPUは普通、データをいったんレジスタに読み込んでからメモリやI/Oに転送 したり、演算を行ったりします。8086系には一般に14種類のレジスタが存在し ます。それぞれの役割を簡単に示します。

セグメント

 8086は1メガバイトのメモリを使うことができます。これは最近ではおせじ にも大容量とはいえませんが、当時主流だった8ビットCPU 8080やz80などは、 64キロバイトしか一度に扱うことができませんでした。このことを考えてみる と、非常に高性能なCPUだったことがわかるでしょう。8086は、8080やz80など のソフトウエア資産を移植しやすいようにと、メモリの管理をこのセグメント という概念を用いて管理しています。このセグメントという概念は8086のマシ ン語のプログラミングをやる上で非常に大切な概念です。また、8086のプログ ラミングを難しくしている一因でもあります。

 8086は1メガバイトのメモリを操作するために20ビットのバス幅を持ってい ます。しかし8086のレジスタは16ビットの幅しかありません。どのようにして 1メガバイトのメモリにアクセスしているのでしょうか?

 8086は2つのレジスタを足し算することで、20ビットのアドレスを実現して います。2つのレジスタとはセグメントレジスタとインデックスレジスタ、ま たはセグメントレジスタと特殊レジスタのことです。単に2つのレジスタを足 し算しただけでは16ビットのままですから、まずセグメントレジスタを4ビッ ト左にずらしそれをインデックスレジスタまたは特殊レジスタとを足し算しま す。16進法で言えば、一桁左にずらして足し算すればよいのです。

(例)

SSがF04AHでSPが159BHの時、CPU(8086)が実際にアクセスするアドレス(つ まりアドレスバス上にあらわれるアドレス)は

          F 0 4 A   H
        +   1 5 9 B H
        --------------
          F 1 A 4 B H

となります。

 セグメントレジスタに納められたアドレスをセグメントアドレス、特殊レジス タまたはインデックスレジスタに納められたアドレスをオフセットアドレスと 言います。8086がメモリに対してアクセスするアドレスは物理アドレスと言い ます。

 8086は1メガバイトのメモリを扱うことはできると言っても、実際は64キロ バイト単位でしかメモリを扱うことができません。つまり連続して1メガバイ トのメモリ空間をアクセスできないわけです。

ちょっといい話(謎)

 20ビットで1メガバイトをアクセスできるのですが、それでは16ビットでは 何キロバイトまでアクセスできるのでしょうか? 8ビットCPUの8080やz80はア ドレス幅は16ビットでした。16ビットでは2の16乗、すなわち64キロバイトま でしかアクセスすることができません。勧の良い人はもうお気づきかと思いま すが、実はこれが8086がセグメントを導入した理由なのです。

 64キロバイトごとにメモリを使い分けることで、プログラムを作りやすくし ようと考えたわけです。しかしこのセグメントの概念は「64KBの壁」と言われ るようになり、後のプログラマたちを苦しめることになります。

 8086はよく言えば8ビットのソフトウエア資産を考えたCPUでしたが、わるく いえば8ビットの呪縛から逃れられないままの16ビットCPUだったのです。(こ の呪縛は80286にも引き継がれていますが、80386以降はかなり強力なメモリ管 理機能が付くようになりました。)

 セグメントアドレスはDOS上でプログラミングする場合は、DOSが自動的に設 定してくれるので、セグメントアドレスはプログラマ自身が設定することはま ずありません。しかしプログラムで64キロバイト以上の連続したアドレス空間 が必要な場合、プログラマ自身が設定してやらなくてはならないこともありま す。

スタック

 ところでSS(セガサターン....もといスタックセグメント)は「スタッ ク専用のセグメント」と説明しましたが、スタックとはいったい何のでしょう か?

 マシン語のプログラムで、処理するデータや処理に必要なデータを格納する ためのメモリ領域を、ワークエリアと呼びます。プログラムを制作する過程で、 レジスタの内容を一時的にデータをRAMに退避させなければならない場合が多 く出てきます。たとえば、AXレジスタを演算に使いたいのだが、今現在のレジ スタの内容を保存させておいて演算後にもう一度使いたい、と言う場合などで す。そこでこの「スタック」という概念が生まれました。

スタックのメリット

 スタックは、簡単にいえばデータを積み上げて、使うときになったら上から 順々に(つまり一番最後に積み上げられたデータから)取り出すことです。本 を積み上げることを例に取れば、積み上げた本を取るとき一番上に載っている 本、最後に載せた本しかとれないわけです。このスタックの概念を用いること で、プログラマはデータを格納する際、メモリのアドレスを全く考慮せずにデ ータを出し入れできるようになるわけです。しかも高速にメモリに転送できる というメリットもあります。

 SSとSP(スタックポインタ)には、このスタックしてあるデータの一番上の アドレスが入っています。だから普通、SSとSPは常に一緒に使われます。プロ グラマはスタックの出し入れに関する命令を用いる際、スタックポインタがい ったいどこを指しているのかという心配は不要です。というのは、スタックの 出し入れを行う命令では、スタックポインタの操作が自動的に行われるからで す。

まとめ

 以上で大体の8086の基礎を説明しましたが、次回は具体的にマシン語を使って プログラムを説明していきます。

情報棟を活用しよう!

東大 ECC ことはじめ
Aleph-NULL

はじめに・情報棟事始め

 新入生のみなさんは、理系は1学期に、文系は2学期に情報処理の講義をうけることに なります。初回を除いて(クラスによっては初回も)、正門の左手にある電車から 見えるひときわ新しい建物、「情報教育南棟」で授業を受けます。まずは 1階の自習室に入って見ましょう。「X端末」と呼ばれる端末が山ほど並んでいます。 ここのシステムは、UNIX の一種である SunOS を用いたネットワークシステムに なっていて、ここから電子メールのやり取りやネットワーク・ニュースの 読み書き、それに WWW (World Wide Web, 通称Mosaic) へのアクセスもできます。 東大のネットワーク UT-net2 を通じていわゆる Internet に通じているので、 世界中の情報にアクセスすることもできます。

すこし予備知識に触れておきます。

絶対やってはいけないこと

UNIX と MS-DOS の大きな違いは?

 MS-DOS が UNIX からいろいろな機能を取り込んだことはよく知られています。 階層ディレクトリとか標準入出力の概念とかです。しかし、根底に流れる思想は 全く異なるといっていいでしょう。簡単にその辺りを説明します。

 UNIX では、複数のユーザが同時に1つのコンピュータを使うことができます。 また、1人のユーザが同時に複数のプログラムを動かすこともできます。 それぞれの動作しているプログラムのことを「プロセス process」といいます。 そして、各プロセスは「完全に独立に」動作することが可能です。 MS-Windowsのように、「1つのプログラムが作業をしている間はほかのプログラムは 動作できない」ということもありません。また、ユーザのファイルもきちんと 公開・非公開の設定が可能です。

 また、システムレベルでネットワークがサポートされており、 ネットワークを通じて別のコンピュータにログインして作業をしたり 情報を取得することも比較的容易です。

ログインしよう

 手続きの際に、学生証の下に変な紙切れが付いていたと思います。 そこには、g64**** (理1の場合)とかいうユーザID (g + 学生証番号)と、 アルファベット・数字の羅列が印刷してあると思います。

 情報棟のコンピュータは3万人近い人数が利用できますから、まず 使い始めに自分が誰であるか、本当にその本人であるかをコンピュータに 示さなければなりません。

 適当に開いている端末を探して、もし電源が入っていなければ(キーボードの 上の方のPowerランプがついていなければ)端末前面左の電源スイッチを 押してください。白地に黒文字でいろいろメッセージが表示された後、 グレーバックにユーザID とパスワードの入力を求める画面が表示されるはずです。 電源が入っていて、そのような状態に初めからなっているかもしれません。

 カーソルはユーザIDのところにあるはずです。ここにあなたの ID を入力してください。 Return キーを押すと、パスワードの欄に移るはずです。パスワードは画面に 表示されませんので気をつけて入力してください。

 正しく入力できたらなんか「GAME禁止」とか画面に出た後、指示どうりクリックすると、 しばらくして3つのウィンドーと郵便受けが表示されるはずです。

g6?????@xss??> とか出ている2つを「シェルウィンドー」とか「コンソール」とか 呼びます。下の方に反転した *scratch* とか出ている方をとりあえず「Mule」 (みゅーる)と呼んでおきましょう。

 この画面は、UNIX での標準的なウィンドーシステムである X-window の画面です。 自分でカスタマイズすると見栄えをいろいろと変えることが可能ですが、それはおいておきましょう。

 まず、何か処理をする際には、マウスカーソルを処理をするウィンドーに入れることから 始めます。枠線の色が変化して、カーソルが黒くなるはずです。

 先に終了の方法を説明しておきましょう。何もウィンドーが無いところ(「ルートウィンドー」と いいます)にカーソルを持っていって、マウスの右ボタンを押しっぱなしにすると、 メニューが出てくるはずです。一番下の「Exit X-Window」かなにかを反転させて マウスを離すと終了します。でも結果の保存は忘れずに。Mule を使った時は Mule をきちんと終了させてからの方が賢明です。

 まず、シェルウィンドーの広い方にカーソルをいれて、「finger」と入力して Return を押して見てください。これを今後「finger コマンドを実行する」 と表現します。すると、よほどすいていなければ何人もの人が表示されます。 実は皆さんの手前にある X 端末は実は画面の処理しかしていません。実際の処理は 別の部屋にある「端末サーバ」にネットワークで接続して行っています。 駒場では6〜8台のX端末が同時に1つのサーバを使っていて、いま表示されたのは その同じ端末サーバを使っている人の一覧です。

準備

 次に進む前に一回準備をしておきましょう。

 実名の登録とパスワードの変更を行います。

 シェルウィンドーから chfn コマンドを実行してください。 あなたの名前の入力が要求されるはずです。メールやネットニュースなどでも 使われるので、ローマ字で実名を入力してください。次に パスワードを要求されますから、入力してください。

とか表示されればきちんと実名が登録されました。

 とか出て来た場合は後で再トライしてください。 「パスワードが合わない」とかいわれた場合はパスワードの 入力をミスったのでしょう。やり直して見てください。

次に passwd コマンドを実行してください。 ここで、「忘れにくく」「他人に勘付かれない」「英数字6〜8字」の パスワードを決めてください。間違えても自分の名前とか「tsg」とか 「inu」とか「tokyo」とか誕生日とかは駄目ですよ。脈絡のない 英記号2つと数字1つの組み合わせとかでもいいでしょう。決めたら指示に従い 新しいパスワードを2回、これまでのパスワードを1回入力してください。 あとは前の名前の場合と同じです。

 パスワードの変更は受け付けられてから1日程度かかる事があるので、 変えたばかりの新しいパスワードがログインの時に受け付けられない時は古い方を 試してみてください。

 パスワードは最低でも2ヶ月に一度は変更することが望ましいと考えられます。 管理には十分気をつけてください。普段持ち歩く手帳には書かない方がいいでしょう。

Mule と電子メール

 「Mule」は、文章やプログラムなどを書くためのプログラムです。 「情報処理入門補遺」にも若干使い方が書いてありますが、 カーソルキーと Backspace キーを使うとなんとか英文の編集くらいは できるはずなので、まずはいじって使い勝手を試してみてください。 大文字やキーボードのキーの上の方に書いてある文字は Shift キーを 押しながらキーを押すことで入力できます。とりあえず一通り 記号を入力して見ましょう。なにかの拍子に画面の反転行の下に カーソルが行ってしまったら、Ctrl を押しながら g を押せば 戻るはずです。(このような操作を C-g と略記します。)

 一通り慣れたら電子メールの練習をして見ましょう。  シェルウィンドーから「~g540001/bin/mailtest」を実行して見てください。 長いので入力を間違えないように。このコマンドは練習用にあなた自身に メールを送るようになっています。

 実行して少しすると、「ビッ」とかいう音とともに郵便受けが黒く反転する はずです。これがメールが届いた合図になります。

 メールが届いたら、Mule のウィンドーから「ESC x mh-rmail Return」と 入力してください。最初の ESC x で画面の下には M-x とかでてるはずです。 その後ろに mh-rmail と打ち込んで Return を押すのです。 うまく行かなかったら C-g で戻ってもう一回試して見ましょう。

 この操作をすることで、システムの「郵便受け」のメールが「自分の手元」に 取り込むことができます。

 画面が切り替わって上半分にはメールの一覧が、下半分には本文が見えているはずです。 読む時のキー操作を書いておきます。

Space本文のページをめくる
↑↓メールを選ぶ
.選んだメールを表示
ESC R古いメールも含めて一覧表示する
qmh-rmail を終了する
imh-rmail の最中に届いたメールを取り込む

 次に、試しに自分にメールを出して見ましょう。 mh-rmail を起動した状態で、m を押します。 画面の下の方に、To: とか表示されているはずです。 ここに送り先の ID を書きます。ここでは自分の ID を入力して Return を 押してください。 次に cc: がでてきますが、メールの写しを送っておく相手が いなければ Return で結構です。 最後の Subject: にはタイトルを入力します。 そうすると、画面が切り替わって、


	  To: g******
	  cc: 
	  Subject: *****
	  ----------
	  

 とかなっているはずです。(多少違ってもいいです) 線の下になにかを打ち込んで、To: がちゃんと自分になっていることを 確かめたら、C-c C-c (Ctrl を押しながら c を2回押す)で 送信します。mh-rmail に戻りますから、郵便受けが反転したら q で終了してもう一度mh-rmail を起動するか、i でメールを 取り込むといま送信したメッセージが取り込めるはずです。できましたか?

 日本語入力の方法は「情報処理入門 補遺」などに記載されています。 日本語が入力できるようになったら、友人宛にメールを出して見ましょう。 本文の画面になってから、気が変って送信をやめるには C-c C-q です。 また、線の上の To: を編集すると宛先を後から変更することも 可能です。

Netscape

 いま世の中で大流行している Mosaic にアクセスして見ましょう。  シェルウィンドーから "netscape &" と入力して Netscape を 起動して見ましょう。

 しばらくして(ライセンスの同意を要求されるかもしれない)駒場情報教育棟 のページが表示されるはずですが、文字化けが激しいかも知れません。

 最初に設定が必要です*1。 メニューのから、次の順序で設定を変えていってください。

 そうしたら一回 [Reload] とかかれたボタンを押してください。 これで正常に立ち上がらなかったら、Menu の File -- Quit で一旦終了して、 もういちど立ちあげてください。

 各ページには何ヶ所かの下線の引かれた文字(アンカー)があり、 画面の一番上にはなんか http://www.komaba.ecc.u-tokyo.ac.jp/ とかかかれた 文字欄があるはずです。この文字欄に URL と呼ばれるページの指定を打ち込んだり、 下線の引かれた文字列の上で左ボタンを押したりしていくとどんどんページが 変わって行きます。ネットサーフを愉しんでください!

 なお、TSG のホームページは

http://www.komaba.ecc.u-tokyo.ac.jp/~g541119/TSG/TSGhome.html

 です。こちらもぜひご覧ください。

コマンドについて(MS-DOS ユーザへの注意)

 「UNIX 入門」も書くつもりですが、とりあえずちょっとだけ…

 コマンドは DOS とはかなり違いますが、いじっていくうちになれるとは 思います。参考書をなにか求めるのがいいでしょうが、 先にDOS ユーザがよく陥る注意を述べておきます。

 よく使うコマンドだけ DOS と対照してあげておきます。

UNIX DOS
dir ls -sl
dir/w ls
copy cp
del rm
ren,move mv
type cat
cd cd
md mkdir
rd rmdir
 コマンドラインの文化は圧倒的に UNIX の方が上です。これについては 「UNIX 入門」で触れます。

今後

 次の新入生歓迎号では、Netnews の扱い方とエチケットについて、 それと「UNIX 入門」と題してコマンドを通じて UNIX と情報棟を 256 倍とはいわずとも 16 倍くらいは使う方法に入ります*2。 ぜひ TSG に入って次号を読んでください (^^;。*3



[総目次へ]

g541119@komaba.ecc.u-tokyo.ac.jp