• ベストアンサー

これがプログラミングなのかもわからないのですが…

さっぱりわからないので詳しく説明してもらいたい所なのですが、きっと理解できないと思うので…簡単に(1)(2)について述べてもらえると嬉しいです。 (1)計算機における割り込みの用途と通常のサブルーチン・コールとの違い (2)プログラムを再配置可能なものに変換する上で、CPU,アセンブラなどで用いられている工夫について  あと、右シフトだと除算で、左シフトだと乗算ですよね。じゃあ回転をするときって、何がもとめられるんですか?  困っているのでどうかよろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.5

「LSB(bit0)のチェックと回転を繰り返すと、ビットの状態を順次チェックできます」とありますが、どういう意味ですか?どんなビットの状態? ->ループを利用して、LSB~MSBの各ビットを順番に調べてビットが立っているかどうかのチェックできると言う意味です。例として適当でないかもしれませんが。 シフトと回転にCFが混ざるときはどんな時に使うのですかね? ->例えば8bitのレジスタを左シフトした場合を考えてください。 この時シフト前のMSB(bit7)がCFに入るようになっていると、CFを判定することでMSBが立っていたかどうかが判定できます。 また、これが2倍の演算処理だった場合、CFによってオーバフローが起こったかどうか判定できます。 更に、2つの8bitレジスタを使って16bitの演算(2倍)を行なうような場合、下位8bit用のレジスタを左シフトし、続いて上位8bit用のレジスタを左シフトすることで16bitの演算が出来ます。 左シフトした時の動作は、「左シフト->LSBにCFが入る->CFに元のMSBが入る」となっているので、上記の16bit演算の場合は下位のMSBがCFを経由して上位のLSBに移動することになり、2つのレジスタが連動してシフトしているような動作となります。

romeo333sleeper
質問者

お礼

具体的にありがとうございまーす。

その他の回答 (7)

  • anisol
  • ベストアンサー率48% (146/301)
回答No.8

8086系のCPUを勉強してるみたいですね。「AX_DXとか使ってます」とのことなので。8086は「すっごく昔のやつ」というより、今のペンティアムとかの先祖ですよ。メモリの管理方式は変わりましたが、基本的な命令語は全く変わっていません。今でも充分通用する知識です。 ちょっと補足すると、8086系の割込みには「ハードウェア割込み」「ソフトウェア割込み」「内部割込み」があります。皆さんが説明されているのは「ハードウェア割込み」「内部割込み」についてですね。「ソフトウェア割込み」は普通のサブルーチン呼び出しとほとんど変わりません。 回転を使うときは一巡りするともとのレジスタの内容と変わらない利点があります。 「講義をちゃんと受けていても何を言っているのかわからないんです」 気持ちはよく分かります。ぜひ自分でプログラムを書いて試してみることをお勧めします。Windowsのコマンドプロンプトで"debug"という簡単なアセンブラ(本来はデバッガ)が使えます。使い方は馴れるまでちょっと大変かもしれないですが簡単なプログラムならこれで試してみるのが手軽で一番です。アセンブラはコンピュータの基礎です。そんなに難しいものではないので、ぜひ理解してください。

romeo333sleeper
質問者

お礼

そうそうペンティアムの先祖!! 最初のときに言っていましたよ、確か。 16ビットしか表せないとかってのも最近知りました。 教科書無くて、私は黒板の板書だけをたよりにやってるんです… 何か良い参考書ってないんですかねぇ。 回答ありがとうございました。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.7

>プログラムを再配置可能に変換するってどういう意味でしょうか? なら、初めからそういう質問をしないと回答はきませんよ(^^;; 再配置可能(リロケータブル)であるプログラムは、 メモリ上の任意のアドレスで動作するように作られているプログラムのことです。 そうでないプログラムとは、例えばアドレス $100000にないと実行できないプログラムのことです。 なぜ、実行できないというと、例えば変数 x が$100100にあり、サブルーチンが$1000080にあり、 プログラム中でxを参照する際に$100100のアドレスを参照するとか、 サブルーチン$100080をコールするとかいう命令が記述されているからです。 (絶対アドレス指定) ですので、このプログラムを$200000というアドレスにおくと実行できません。 $200000で実行したければ、xを$200100,サブルーチンを$200080と書き直す必要があります。 これがリロケータブルなプログラムの場合,例えば変数xはプログラムの先頭から$100ずれた場所、サブルーチンは 先頭から$80ずれた場所という相対的な場所(相対アドレス)でとして使うような命令が記述されています。 これならプログラムをどこにおいても中身を直す必要がありません。 おおざっぱに言えばこういうことです。 具体的に対象とするCPUがわかれば、もっと具体的に書ける人もいると思います。

romeo333sleeper
質問者

お礼

すみません(;;) 質問して答えてもらってから質問の意味も分からないことに気付く…。 今後もきっと初歩な質問をすると思いますがよろしくお願いします。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

貴殿の質問の中に出てくる、術語は「割込み」(割りこみや割り込みより検索ヒット率良いかも)、「サブルーチン」「コール」「再配置可能」「右シフト」「左シフト」回転(シフト)」ですが、下記の「術語」に広げて WEB照会し、自分にあったものを選択してみたらどうですか。 下記のURLは私のお勧め分です。 ●ソフトウエア割りこみ http://www2.muroran-it.ac.jp/circle/mpc/pc98dos/dos/dosinit.html ●リロケータブル・リエントラント・リユーザブル ●ビット・回転 http://www.cs.shinshu-u.ac.jp/Lecture/SE2/Z80/lecture6.htm ●回転命令 http://tomato.sakura.ne.jp/~suzu/asm/7.html ●ブランチとコール ◎私見意見 「サブルーチン・コール」でないのですが、IBMのAsmにBCRといってレジスターに次の番地を入れ、ルーチンに飛んでいって処理をし 次の指令に戻るのがあったと思います。 機会語レベルで既に、それに都合の良いそのしかけがある場合が 多いと思います。サブルーチンで言う「プログラム」=高級言語のみではないことを言いたい。 「割りこみ」入出力の要求、終了の通知、障害の通知のほかに 演算のエラー(0で割り算)、根底的なエラー・アドレス違反エラーなどソフト関係の不都合でも起こると思います。  総務係が受付に呼び出しボタンや電話を置いて、総務の本来の 仕事をしているイメージを思い出します。来客があったときだけ、 出ていって応対するイメージで、ボタンがならない間は気にする 必要がないので、仕事が整理して考えやすい。  ただ機械語以下のレベルでマイクロプログラム(今は別の表現 があるかも)がソフト的に動いている「石=CPU」もあり得るので 一応のレベルの了解のものでしょう。 「再配置可能」 (1)機械語の中のアドレスを表すレジスターを持っている設計や(2) この機械語を使う時はあるレジスターをアドレスレジスタとする 設計や仮定になっている。などがある場合、X(Y)と表現するとすると実際実行時には、X+Y番地を参照するようにしておけば XにOSがX<=「空いている番地の先頭アドレス(ベースアドレス)を入れる」とYの部分はそのままでも他のプログラムの配置と衝突しなくて済む。各階に部屋番号があり、何階かは使う時に指定してもらう ようにするイメージです。 あるいはページという管理単位を設定して、空き・使用中の単位を設定する方法もあります。これでOSがメモリ管理することも可能です。空き部屋を総務係が管理し、会議が開く要求あり次第、 空き部屋を探して、そこで会議しろとコントロールするイメージです。 以上知識が旧い面があり、さらに勉強されることを祈ります。

romeo333sleeper
質問者

お礼

具体例で、ありがとうございました。 私も本当に勉強を頑張らなければっ!!

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.4

1)サブルーチンと割り込みの違い ・サブルーチンは、ある特定の処理をするために定義したプログラムで、メインプログラムから  呼び出した時に実行され、処理が終るともとのメインプログラムに戻ります。 ・割り込みは、I/Oのイベントによって発生します。  この時、実行中のプログラムは一時中断し、  割り込み処理ルーチンに制御が移り、処理が終了するともとのプログラムに戻ります。  いつ割り込み処理が実行されるかを実行中のプログラムで制御することは出来ません。  割り込み処理される例として、受信割り込み、キーボード割り込み、タイマー割り込みなどがあります。 2)プログラムを再配置可能にする  アドレスを絶対番地ではなく相対番地にしますが、実現方法はCPUによって異なります。  i8086の場合は、セグメントレジスタでベースアドレスを指定していました。 3)ビットの回転(ローテイト)について  シフトに比べて用途は少ないかもしれません。  例えば、16ビットの値を8ビット回転させると上位と下位の8ビットが入れ替わります。  また、LSB(bit0)のチェックと回転を繰り返すと、ビットの状態を順次チェックできます。  

romeo333sleeper
質問者

お礼

ふんふん。(1)は皆さんのおかげでなんとなくイメージつかめました。 (3)「LSB(bit0)のチェックと回転を繰り返すと、ビットの状態を順次チェックできます」とありますが、どういう意味ですか?どんなビットの状態? シフトと回転にCFが混ざるときはどんな時に使うのですかね? (1)(2)は少し解ったようなきがします。ありがとうございました。

  • K-1
  • ベストアンサー率21% (832/3844)
回答No.3

1)割り込みはタイマ、I/Oなどで発生するため、割り込み処理は処理されるタイミングが不定期である。   サブルーチンはメインルーチンから呼び出すタイミングが固定。 2)ジャンプテーブルの利用、相対アドレスによるジャンプ等を用いて、絶対アドレスに依存しないようにする。 「右シフトだと除算で、左シフト~」 どのCPUでの話かわからないので、なんともいえないのですが、 シフトはシフト後、はみ出たビットは捨てられるが、 ローテート(回転)は、捨てられずに最下位に反映される。 ・・・てなとこでしょうか。

romeo333sleeper
質問者

お礼

CPUはすっごく昔のやつについて扱っているようです。AX_DXとか使ってます。 講義をちゃんと受けていても何を言っているのかわからないんです。 一度自分で勉強しようかと思っていますが、どうしたらいいでしょうかね。 回答ありがとうございました。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

(1) 割り込みは不定期におこること、急いで処理が必要なこと,めったにない処理を行うことに向いている。 サブルーチンはプログラム中で規則性の高い処理に向いている。 (2) CPU:命令が絶対アドレスに依存しない物を用意する。 セグメントレジスタ,インデックスレジスタによるメモリの間接参照、プログラムカウンタによる相対ジャンプ、相対コール等。 MMUによるアドレス変換機能という手もあるけど。

romeo333sleeper
質問者

補足

!!!今更なんですけど、自分で質問していてなんなんですけど…(2)の質問の意味がわかりません。プログラムを再配置可能に変換するってどういう意味でしょうか? (2)の回答、全然理解不能です。 (1)は解りました。ありがとうございます。  呆れているかもしれませんが、本当に困っているので(2)よろしくお願いします。

  • coco1
  • ベストアンサー率25% (323/1260)
回答No.1

(1)割り込みは、入出力が終わったこと、ハードウェアに障害が発生したことなどをプログラムに通知する、一種の「警告」と考えればよいと思います。 プログラムの実行中、常にハードの障害を考慮したり、入出力が終わるのをまったりしていては効率が悪いので、通常はこれらの発生を考慮せず、発生したときのみに通知をするようにしておくのです。この点で、プログラムが積極的に利用するサブルーチンとは異なります。 (2)再配置可能プログラムでは、メモリを絶対番地ではなく、ベースアドレスからの相対番地で指定する、という工夫が必要になります。

romeo333sleeper
質問者

補足

「プログラムが積極的に利用するサブルーチン」とありますが、サブルーチン・コールの意味も実は良く分からないのですが。サブルーチンとは、主な流れとは別のところでやっている演算のことですとね?  あと、ベースアドレスからの相対番地というのも、もう少し説明していただきたいのですが。  こんなに早く回答して頂いて嬉しいです。これについても、またよろしくお願いします。

関連するQ&A