機械語プログラムの停止時の条件とは?
- 機械語プログラムの番地機械語ニモニック表記コメントについて解説します。
- プログラムが停止する条件とは、6番地にジャンプする命令があるかどうかです。
- このプログラムを実行した場合、3分くらい止まらない可能性があります。
- ベストアンサー
機械語
番地機械語ニモニック表記コメント 0 11101000 Shift 8 ;無駄な命令.ただしAccumulatorの内容は0になる 1 10011111 Store 31 ; Accumulator の内容を31 番地へ格納 2 01100001 Load 1 ; 1 番地のデータ(Store 命令) をAccumulator へ 3 01000110 Sub 6 ; 6 番地の内容(= 1) をAccumulator から引く 4 10000001 Store 1 ; 引いた結果を1 番地に格納 5 01100111 Load 7 ; 7 番地の内容(= 0) をAccumulator へ 6 00000001 Jump 1 ; 1 番地にジャンプする 7 00000000 0 ; 0 データの保管場所 このプログラムが停止するのはどんなときですか? これを実行したら3分くらい止まらなかったのですが・・・
- TOMA3566
- お礼率5% (3/56)
- その他(プログラミング・開発)
- 回答数6
- ありがとう数0
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
---------- 0 111 01000 Shift 8 ; 無駄な命令.ただしAccumulatorの内容は0になる 1 100 00111 Store 7 ; Accumulator の内容を7 番地へ格納 2 011 00001 Load_ 1 ; 1 番地のデータ(Store 命令) をAccumulator へ 3 010 00110 Sub__ 6 ; 6 番地の内容(= 1) をAccumulator から引く 4 100 00001 Store 1 ; 引いた結果を1 番地に格納 5 011 00111 Load_ 7 ; 7 番地の内容(= 100 00111) をAccumulator へ 6 000 00001 Jump_ 1 ; 1 番地にジャンプする 7 100 00111 Store 7 ; Accumulator の内容を7 番地へ格納 ---------- 0 111 01000 Shift 8 ; 無駄な命令.ただしAccumulatorの内容は0になる 1 100 00110 Store 6 ; Accumulator の内容を6 番地へ格納 2 011 00001 Load_ 1 ; 1 番地のデータ(Store 命令) をAccumulator へ 3 010 00110 Sub__ 6 ; 6 番地の内容(=100 00110) をAccumulator から引く 4 100 00001 Store 1 ; 引いた結果を1 番地に格納 5 011 00111 Load_ 7 ; 7 番地の内容(= 100 00110) をAccumulator へ 6 100 00110 Store 6 ; Accumulator の内容を6 番地へ格納 7 100 00111 Store 7 ; Accumulator の内容を7 番地へ格納 ---------- 0 111 01000 Shift 8 ; 無駄な命令.ただしAccumulatorの内容は0になる 1 000 00000 0 ; データ 0 2 011 00001 Load_ 1 ; 1 番地のデータ(= 0) をAccumulator へ 3 010 00110 Sub__ 6 ; 6 番地の内容(=100 00110) をAccumulator から引く 4 100 00001 Store 1 ; 引いた結果を1 番地に格納 5 011 00111 Load_ 7 ; 7 番地の内容(= 100 00110) をAccumulator へ 6 100 00110 Store 6 ; Accumulator の内容を6 番地へ格納 7 100 00111 Store 7 ; Accumulator の内容を7 番地へ格納 ---------- 1番地の命令が、書き換わり、 「Accumulator の内容を7 番地へ格納」し、 つぎに 「Accumulator の内容を6 番地へ格納」すると、 ループは終了します。
その他の回答 (5)
- don_go
- ベストアンサー率31% (336/1059)
機械後のビットパターンを見る限りでは、8bitの中の 上位4bitをコマンド、下位4bitをデータとしている様に みえるのですが...4bit CPU? 8bit CPUの場合だとコマンド・データ様に1~2バイト アドレスに2バイト使用するので、質問にある様な番地 にはなりません。 番地 機械語 ニモニック表記コメント 0000 Shift 8 ;無駄な命令.ただしAccumulatorの内容は0になる 0001 8 ;(1byte データ) 0002 Store 31 ; Accumulator の内容を31 番地へ格納 0003 &H31 ;(2byteアドレス CPUにより格納方法が異なる) 0004 0005 Load 1 ; 1 番地のデータ(Store 命令) をAccumulator へ 0006 &H00001 ;(2byteアドレス) 0007 0008 Sub 6 ; 6 番地の内容(= 1) をAccumulator から引く 0009 &H0006 ;(2byteアドレス) 000A 000B Store 1 ; 引いた結果を1 番地に格納 000C &H00001 ;(2byteアドレス) 000D 000E Load 7 ; 7 番地の内容(= 0) をAccumulator へ 000F &H00007 ;(2byteアドレス) 0010 0011 Jump 1 ; 1 番地にジャンプする 0012 &H0001 ;(2byteアドレス) 0013 0014 0 ;データの保管場所 ...どちらにしても何をしようとしているのか意図不明 コマンドの部分を書き換えようとしているみたいですが その場合、動作は不定となります。 >これを実行したら3分くらい止まらなかったのですが・・・ 逆に言えば3分で止まったのでしょうか? #たまたまHALT(プロセッサの動作を停止)相当の値の格納 #された番地に辿りついた?
- SRitchie
- ベストアンサー率21% (103/470)
CPUがわかんなきゃ、回答できません (CPUが分かっても分かっても即答できるか判りませんが…レジスタとか調べなきゃいけない場合もあるし)
- gyrocompas
- ベストアンサー率23% (24/104)
これは、組み込み用のCPUですかね、 むしろ、どうやって止めたかに興味がありますね。 通常、プログラムが無限ループに入った時の対処はまずはOSに依存します。 組み込みだと、OSなんぞは、ありませんでしょうからな~
- DT200
- ベストアンサー率38% (63/164)
31番地から0番地の内容を全て0にする。ということで良いですか? 1番地のStore命令は順次1減算されますからストアするアドレスは 31番地から0番地へ移動します(下位4ビットがアドレスなら)。 ところが、6番地を0にしてしまうと次に実行するときは 6 00000000 Jump 0 ; 0番地へジャンプ となります。 0番地に戻って実行を続行すると、3番地の命令が 3 01000110 Sub 6 ; 番地の内容(=0) をAccumulator から引く ですので、0を引くことになり1番地の内容が変化しません。 よって、この状態で無限にループする事になります。
- gonbee774
- ベストアンサー率38% (198/511)
プログラムアドレスとデータアドレスが別空間であるなら、永久ループだと思います。 機械語でしたら、CPUがわからないと回答できないとも思います。 (コメントが正しいとも限りませんし)
関連するQ&A
- アキュムレータに格納される数値は・・・?
次の問題の解き方をできるだけ詳しく教えてください。 主記憶装置の100番地~104番地の内容は以下のようであるとき、LD/(102)を実行した結果アキュムレータに格納される数値は? LD命令は指定した有効アドレスの内容をアキュムレータに格納するめいれいであり、(X)は間接アドレス指定である。すなわちX番地の内容を 有効アドレスにするという意味である。 103 102 100 101 104 100番地 101番地 102番地 103番地 104番地
- ベストアンサー
- その他([技術者向] コンピューター)
- ニーモニックを使った命令の2進数表記
計算機の、ニーモニックを使った命令を二進数表現するという問題なのですが、LOAD、STOREなどのニーモニックについては教科書に載っているのでわかりますが、以降のレジスタ、番地指定などの2進数表現が教科書に具体的に載っておらず、困ってます。 回答宜しくお願いします。 (問題は、r0の内容を300+r1番地に格納する命令です)
- 締切済み
- その他([技術者向] コンピューター)
- 情報処理概論
今情報処理概論という勉強をしています。教科書をよんでもわからないので2つ質問です。 1.プログラムカウンタと命令レジスタ 例えばプログラムカウンタが”2256040”であるとき、次のフェッチサイクルではこの番地からはじまる命令が命令レジスタに移され移された命令が4バイト命令であれば、プログラムカウンタには4が加えられる。、と教科書に書いてあるのですがチンプンカンプンです。誰かわかりやすいように説明していただけますか? 2.演算装置について 例えば”01001010 11001101”と表記されている命令は、あるコンピュータでは”1010 11001101”にある16ビット符号付整数を演算装置のレジスタ(アキュムレーター)の内容に加え、その結果(和)をアキュムレーターにセットすることを意味する。、と教科書に書いてあります。まったく意味不明なので誰かわかりやすく説明できる人回答お願いします。 ながくなりましてすいません。よろしくお願いします。
- ベストアンサー
- その他(学問・教育)
- アドレス指定方式での、命令語が参照する番地
16進数で”C13B0206”という32ビットの命令語があります。 <命令語の仕様> 0~7ビット:命令指示部 8~10ビット:レジスタ 11~15ビット:アドレス修飾部 16~31ビット:番地 <アドレス修飾と参照番地の関係> 00 0固定 直接アドレス (11,12の値が00、13~15の値が0固定のとき、直接アドレス。) 01 0固定 間接アドレス 10 インデックスレジスタ インデックスレジスタ+番地の値 11 インデックスレジスタ インデックスレジスタ+番地が示す内容の値 <主記憶、レジスタの状態> ●主記憶に格納されている値(16進数) 番地(16進数)が 202,203,204,205,206,208,209,20A...の順に、それぞれの格納値は、 203,204,205,206,208,209,20A,20B...。 ●インデックスレジスタに格納されている値(16進数) インデックスレジスタ番号(16進数)が1,2,3,4,5… の順に、それぞれの格納値は、 0,1,2,3,4…。 (1) アドレス修飾部のインデックスレジスタ番号。 命令語の”C13B0206”で、アドレス修飾部にあたるのが”3B”。00111011(2進数)。8~10ビットの001がレジスタになるから、3。 (2)命令の番地部の番地の値(16進数) 命令の番地部の番地の値。命令部では、”0206”。ちょうど16進数なので、206。 (3) 命令が最終的に参照する番地。 上の、<主記憶、レジスタの状態>より、11~15ビットが”1011”。 インデックス番号が11(2進数)なので、3(16進数)。インデックスレジスタ番号が3のとき、格納されているのは2。番地の値である206と3を合わせ、209。 最終的に参照される番地は209。 (1)(2)(3)、自分の解き方が正しいのかどうか自信がありません。どなたか補足、訂正などありましたら、よろしくお願いいたします。
- ベストアンサー
- その他([技術者向] コンピューター)
- ワンボードマイコンMP-Z80を用いたプログラミング
今、ワンボードマイコンMP-Z80でプログラミングの勉強をしています。 まだ、基本的なところなんですが、次の問題がわかりません。 1)8100H番地から81FFH番地までの100Hバイト分のRAM領域を0とする プログラムを作成せよ。 2)1から10までの整数の和を求め、8100H番地に格納せよ。 3)8100H番地から810FH番地に格納されているデータを8ビットの符号付 絶対値表現とみなしたとき、各データを2の補数表現に変換し、8200H番地から格納せよ。 この三つの問題なんですが、1)は全部に0を入れるということでしょうか? これらの問題は繰り返し命令の範囲の問題なので、繰り返し命令を 使うそうです。ヒントだけでも教えてください。
- 締切済み
- その他(プログラミング・開発)
- PLCの命令語の使い方について
PLCのラダープログラムを勉強し始めたところの初心者です。 各種PLCには様々な命令語が用意されています。(基本命令、応用命令、演算命令など) これらの基本命令について、個々の動作については取扱説明書を読めば理解できますが、 実際にこれらの命令を使って装置のプログラムを書くときに、何をどう使うことが有効なのか? この辺りがよくわかりません。 たとえば、データシフト命令について、内部レジスタを右にシフトしたり左にシフトしたり。 そういうことができるのはわかりますが、じゃあそれを使ったら装置ではどんなことができるのでしょうか? データ転送命令などもよくわかりません。MOV命令でデータをレジスタに格納できることはわかりましたが、これが何の役に立つのやら… 全くの初歩的な質問で申し訳ないですが、取扱説明書を隅々まで読んでいますが、命令語の基本的な機能については紹介してくれていますが、実世界での使い方については全くと言っていいほど触れられていません。 どんな時に、こうした命令語が有効なのか?具体的な例を教えていただければ幸いです。 また、そうした具体例をまとめたようなサイトがあれば併せてご教授いただけませんでしょうか。 よろしくお願いします。
- ベストアンサー
- SE・インフラ・Webエンジニア
- コンピュータアーキテクチャの問題です
(1)レジスタ、メモリに初期状態が以下表である時 レジスタ GR0 7 GR1 2 番地 データ 100 10 110 8 120 3 5÷3の計算を行うための一連の命令をニーモニック表現で示せ 値はすべて10進数とする。 ただし以下の3条件に従うこと 1.最初の命令をLI1、100とする 2.計算結果は120番地に格納すること 3.最低1回は命令でXRを指定すること。 (2)ハードウェア障害によってGR2とメモリの120番地が使用不能となったものとして、5÷3の計算を行うための一連の命令をニーモニック表現で示せ。 初期状態は(1)の開始時と同様とし、(1)とはことなり最初の命令は制限がない。 計算結果は110番地に格納すること。 ニーモニック表現 命令 OP 16進 説明 表記 ロード LD 10 r←(efa) LD GR,adr,XR ストア ST 20 r→(efa) ST GR,adr,XR 加算 AD 70 r←r+(efa) AD GR,adr,XR 減算 SB 75 r←r-(eaf) SB GR,adr,XR 乗算 MP 85 r←r×(eaf) MP GR,adr,XR 除算 DV 55 r←r÷(eaf) DV GR,adr,XR 即値 LI 30 r←ID LI GR, ID という問題ですがわかる人教えてください。よろしくお願いします
- ベストアンサー
- その他([技術者向] コンピューター)
- コンピュータアーキテクチャの問題です
(1)レジスタ、メモリに初期状態が以下表である時 レジスタ GR0 7 GR1 2 番地 データ 100 10 110 8 120 3 5÷3の計算を行うための一連の命令をニーモニック表現で示せ 値はすべて10進数とする。 ただし以下の3条件に従うこと 1.最初の命令をLI1、100とする 2.計算結果は120番地に格納すること 3.最低1回は命令でXRを指定すること。 (2)ハードウェア障害によってGR2とメモリの120番地が使用不能となったものとして、5÷3の計算を行うための一連の命令をニーモニック表現で示せ。 初期状態は(1)の開始時と同様とし、(1)とはことなり最初の命令は制限がない。 計算結果は110番地に格納すること。 という問題ですがわかる人教えてください。よろしくお願いします
- ベストアンサー
- その他([技術者向] コンピューター)
- 大人の科学マガジンVol.24 GMC-4について
お世話になります。TK-80世代なので懐かしさのあまり、思わず買ってしまいました。 さて、当該雑誌の付録である4ビットマイコンのプログラムについて教えてください。 テキスト(?)の53ページ「タイマー」なのですが、これはサンプルとして内蔵されているソフトですが、これを1から作ろうとチャレンジしているのですが、どうしてもわからないことがあります。 それは、最初にタイマーセットということで00番地から02番地に、最初にデータを入力するというものですが、GMC-4の命令郡にはデータメモリのリード&ライト命令はあるものの、プログラムメモリ番地の内容を直接読む命令が見当たりません。 最初に50~52番地へデータを書き込むのなら話はわかるのですが、一体プログラムはどうなっているのでしょう?
- ベストアンサー
- その他(プログラミング・開発)
- 命令を変数に応じて変化させるには?
「テーブル1」というテーブルの「データ」というフィールドにA~Jまで10個データが格納されていたとします。 このデータを変数 DATA01~DATA10 にそれぞれ格納したいと思っています。 下記ソースでは、レコードの終端までループしても、DATA01に「テーブル1」の1レコード目の値、"A"しか格納できませんが、これをDATA02に"B",DATA03に"C"・・・と順々に格納するにはどうしたら良いのでしょうか? それぞれの変数に応じた命令を一つ一つ書くのではなく、Countの値に応じて命令そのものを変化させて行いたいと思っています。他の言語ではわかるのですが、VBではどうするのかわかりません。 ご指導程お願い致します。 Private Sub テスト_Click() Set DB = CurrentDb Set RS = DB.OpenRecordset("テーブル1") Count = 1 Do Until RS.EOF DATA01 = RS!データ RS.MoveNext Count = Count + 1 Loop End Sub
- ベストアンサー
- Visual Basic