• ベストアンサー

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

さっぱりわからないので詳しく説明してもらいたい所なのですが、きっと理解できないと思うので…簡単に(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/17068)
回答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

  • プログラミングについて

    次の問題と似た問題が試験で出るのですがまず例となる問題の答えにどうしてもたどりつけませんどなたか教えてくださいお願いします。 逆ポーランド記法による完全な整数電卓を作成すること仕様は以下の通り INで逆ポーランド記法入力をする OUTで結果を入力する 数値は複数桁対応(3桁まででよい) 数値と数値の間は1つ以上のスペースで区切られる 乗算は、シフト命令をうまくかうこと 除算は、商だけでよい スタック、サブルーチンをうまく活用すること たとえば、文字列を数値に変換する部分や、各演算部分をサブルーチン化するシュミレータによる動作確認をすること

  • [2進数 シフト演算 除算について]

    [2進数 シフト演算 除算について] シフト演算について勉強中です。ご協力お願い出来たら幸いです。 乗算について例えば『1010』(符号ビットを考えず)を2倍 4倍 8倍(2のn乗)した場合 ビットを2倍であれば1つ、4倍であれば2つ・・・左に シフトすれば良いというのは理解しました。 また3倍 5倍などのケースも、 3倍であれば1ケタ左にシフトした数+1010で求まる事も理解しました。 問題は除算です。他の質問を探ってみたのですが、考え方は一緒という回答で・・・詰まっています 除算は右シフトとの事ですが 先ほどの例である『1010』(10)ですがこれを1/2、つまり2で割ると 1つ右にシフトし1010→0101 となり 1010を1/4する場合右に2ビットシフトし 1010→0010.10 となり理解は出来ます。 しかし1/3 、1/5といった場合の計算の仕方が分かりません。 余りを出さないという考えで(近似値になると思いますが) 解き方をご教授願えたらと思います。

  • SHIFTキーについて…

    ちょっとパソコンの調子が悪くて、キーボードをめちゃくちゃにたたいていたら、shiftキーの変換機能が今までのと変わってしまいました… 今までは、右のshiftキーを押しながら「め」を押すと「?」に変換されたのですが、今は右shift押しながら「め」を押すと「・」になってしまいます。(左のshiftを押しながら「め」を押せば「?」が出てくるのですが) 今までは右のshiftキーを押しながら変換していたので、とても気持ち悪いです・・・もとに戻す方法はありますか???

  • mod255の計算

    こんにちは。 今日はmod255の計算について困ったことがあり、質問しました。 私は今、mod255の計算をする回路を作っています。 mod255とはある値を255で割ったときの余りを求めることですよね。 しかし、回路ではあまり除算(回路の性質上、逆数を取って乗算する)を使いません。 理由は、計算に時間がかかることと、回路規模がが大きくなるため。 ある値が255以上か判定してから順次255を引くことも考えましたが、動作が不規則なため使っていません。 そこで、私はmod255を除算を使わず、減算で実現しようと次のような計算法を考えました。 例、239+157をmod255する場合。 239+157=396を2進数に変換すると 11101111 +10011101 ------------ 110001100 ここで、計算結果の右から9番目の1を一番右に移動して加算すると 10001101になります。 これを10進に変換すると141になります。 よって、396-255=141となり396をmod255ができていますよね。 これで、問題解決だと思ったのですが、 ある値が511でこの計算をすると結果が10000000となり 256になってしまいます。 このことから考えて、この計算法は万能ではないみたいです。 この計算法のどこを改善するとmod255を計算できるようになるのでしょうか? また、皆さんなら、どんな方法でmod255を実現しますか? よろしく、お願いします。

  • 算術シフトと論理シフトの違いは?

    「コンピュータはなぜ動くのか 知っておきたいハードウエア&ソフトウエアの基礎知識」書籍内のP61のところにある「表3.1 Z80 CPUの主な命令」の表の「演算命令」の欄に 「SLA:算術左シフトをする」 「SRA:算術右シフトをする」 「SRL:論理右シフトをする」 というのがあるのですが、この「算術シフト」と「論理シフト」はどう違うのでしょうか? 「シフト」と言うと 「データを右にずらす。」 「データを左にずらす。」 というイメージがあるのですが、これと似たようなものなんでしょうか? わかりやすく教えてください。できればわかりやすい「例え」で教えてくれたほうが幸いです。 よろしくお願いいたします。

  • アセンブラについてです。

    シフト命令の乗算、徐算の仕組みが理解できなくてこまってます。 乗算について例をあげます。 8ビット符号なし整数のAL、BLにそれぞれ数値x,yを代入したとします。また、ここでDXはxy(答え)だとします。 次にBLが正ならBLを1bitシフトします。つぎにCF(BLのLSBが入ったキャリーフラグ)が1or0で判断します。0ならそのまま、1ならDX←DX+AXとします。最後ににALを1bit左シフトします。あとはBLが正か負かの処理命令までLOOPします。 確かに実際に値を代入したり、2進数で一つずつ行っても結果は出るのですが、何故BLを右シフトや、ALを左シフト、CFが1or0で区別するのかがわからないです。理解しないままただ作業している状態なので、詳しく説明していただけたら嬉しいです。できることなら、徐算についても同様に説明しただけると嬉しいです。お願いします。

  • ビットシフトについて

    12ビットのデータ(符号付き)を16ビットのデータに変換したいです。 自分なりに考えたのですが・・・ 最上位ビット(符号を表すビット)の位置が違うので左に4ビットシフト、 右に4ビットシフトします(どちらも算術シフトとします) 例  0000 1011 1101 0101 (12bit のデータ) →1011 1101 0101 0000 (左にシフト) →1111 1011 1101 0101 (右にシフト) こうするとたしかに16ビットのデータの最上位ビットには12ビットのデータの符号が 反映されるように思えるんですが、符号を除いた値そのものが変わってしまいますよね? どうしたらいいでしょうか 切羽詰まってて文章めちゃくちゃで分かりづらいかとは思いますが、解答よろしくお願いします。

  • 16バイトアライメントで配置された要素へのポインタ

    非常にトリッキーな質問です。標準のC言語で記述可能かもわかりません。もし可能なら教えてください。 16バイトアライメント配置された要素の先頭アドレスは下位4ビットが0となっています。 そこで、1MBの範囲にある要素へのポインタは本来20ビット必要ですが、下位4ビットが常に0なので、上位16ビットを記憶するだけで十分のはずです。アセンブラで記載すれば可能ですが、Cで、「使うときは、4ビット右シフト」「記憶するときは、上位16ビット」となるようなコードを出力するような記載がわかりません。具体的には、以下のようなアセンブラ結果が希望です。 struct ABC {  struct ABC *next;  int x,y,z;   : } *p,*q; のとき、 q = p->next; は mov ecx,dword ptr p mov eax,word ptr [ecx] slr eax,4 // 使うときは4ビット右シフト mov q, eax q->next = p; は mov ecx,dword ptr q mov eax,p slr eax,4 // 構造体ABCに保存する場合には4ビット左シフト mov word ptr [ecx],eax となってほしいです。

  • shift&アルファベットでうまく大文字にならない

    英文を打つことがよくあるのですが、大文字変換でいつもイライラしてしまいます。 直接入力で大文字にするときって、shift&アルファベットですよね?右のshiftは問題ないのですが、左のshiftはうまく大文字になってくれなくて、よく5,6回強く押しなおすはめになるのです。パソコンが悪いのかなと思いきや、学校のパソコン2,3コ試してもそうだったので私が悪いのかなと思いはじめました。 何が悪いのでしょうか?また、うまく大文字変換できる上手な方法(shiftの角のほうを押すなど、あくまでもshift&アルファベットで打つ方向で)があったら教えてください。 よろしくお願いします。

  • ディスプレイの2画面使用での右側が主で、左がSUBの設定でのマウス

    ディスプレイの2画面使用での右側が主で、左がSUBの設定 「左SUB」+「右主」 このままだと、マウスは「右主」の右端を越える「左SUB」の左端となります ここでマウスの動きを換えられませんか? 「左SUB」の右端「右主」の左端にしたい! ディスプレイが異なるので交換出来ない 右のが大きいので、これを「主」にしたい 配置は下記にあります http://amp8.com/etc/annai/cpu.htm#5-a

専門家に質問してみよう