dポイントプレゼントキャンペーン実施中!

番地機械語ニモニック表記コメント
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分くらい止まらなかったのですが・・・

A 回答 (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 番地へ格納」すると、
ループは終了します。
    • good
    • 0

機械後のビットパターンを見る限りでは、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(プロセッサの動作を停止)相当の値の格納
#された番地に辿りついた?
    • good
    • 0

CPUがわかんなきゃ、回答できません


(CPUが分かっても分かっても即答できるか判りませんが…レジスタとか調べなきゃいけない場合もあるし)
    • good
    • 0

これは、組み込み用のCPUですかね、


むしろ、どうやって止めたかに興味がありますね。

通常、プログラムが無限ループに入った時の対処はまずはOSに依存します。
組み込みだと、OSなんぞは、ありませんでしょうからな~
    • good
    • 0

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番地の内容が変化しません。
よって、この状態で無限にループする事になります。
    • good
    • 0

プログラムアドレスとデータアドレスが別空間であるなら、永久ループだと思います。



機械語でしたら、CPUがわからないと回答できないとも思います。
(コメントが正しいとも限りませんし)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!