3

公開前の編集:それで、私は、私が全体の気紛れな質問をタイプアウトして、きちんと整理した後でのみ、それを自分でかなり理解しました。何の役にも立たないように、とにかくこれを投稿し、これが実際に正しいかどうかを尋ね、提案/コメントを求めています。私はまだ一つのことについて確信が持てません。

了解しました。私はコンピュータサイエンスの初心者です。今、私はアセンブリ言語と機械語のプログラミングについて学んでいます。これは宿題の質問ですので、私が理解するのを手伝ってください、私の顔に答えを投げないでください。条件付き分岐(ループ)を使用して、1から20までの数値の合計(答えは210)を取得するプログラムを作成しようとしています。

使用されるニーモニックは次のとおりです。

L  for load  
A  for Add  
St for store  
BC for branch on condition  
C  for compare
CH for channel

ものを入れるための10個のレジスタがあります。

したがって、基本的に2つのことを行う必要があります。1)1から20(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + ... + 20)までのすべての数値を合計する方法を見つけます。ループの作成を含み、2)カウンターを作成して、20に達したときに停止することを認識します。これは正しいですか??

START    L  R1,COUNT
         A  R1,ONE
         ST R1,COUNT
         A  R2,COUNT
         C  R1,TWENTY
         BC  3,???
         ST R2,SUM
         CH SUM
         STOP
COUNT    DC F'0'
ONE      DC F'1'
TWENTY   DC F'20'
         END START

これはすべて、次のように言っています。COUNTの内容(最初は0)をRegister1にロードします。ONE(1)の内容をRegister1に追加します。Register1にあるこの新しい番号をCOUNTに格納します。この新しい番号をRegister2に追加します。COUNTの内容をTWENTY(20)の内容と比較します。COUNT内の数が20以下の場合は分岐(/ repeat)します(3は条件コードです)。カウンターが20に達すると、条件が破られ、命令は次の行に進みます。レジスタ2にある数値(現在は210)を変数SUMに格納します。次に、CHannelを呼び出して、I/OデバイスにSUMの内容を表示します。その後、停止します。

さて...最初に分岐/戻るように指定する方法がわからないので、カウンターが20に達するまでこのプロセスを繰り返します。COUNTを0として指定する必要があるかどうかもわかりません。

助けてくれてありがとう。

4

1 に答える 1

3

私が見るいくつかのこと。私はこれをテストしていないので、自分でテストすることをお勧めします。

Count の値を追加するときにレジスタ 2 が既知の値で始まるように、レジスタ 2 を初期化する必要があります。

通常、条件による分岐では、条件と、条件が満たされた場合に分岐するラベルを指定する必要があります。アセンブラがこれに必要なものがわからない。

そこで、以下の変更を検討します。C と同様に、2 つのスラッシュを使用して各行にコメントを付けました。Branch on Condition 命令には、テストするフラグを示す条件オペランドと、アセンブラーがラベルに対して計算するオフセットの 2 つのオペランドがあると想定しています。そして、AD 命令は、BC 命令がテストできる条件フラグを設定すると仮定します。BC 命令をテストする条件付きフラグに 3 を入れましたが、オペランドが実際にどうあるべきかわからないので、その行にコメントを入れました。

アセンブラーが 2 つのレジスターの追加を許可し、レジスターをオペランドとして許可する XOR 命令を持っている場合、変数 COUNT をなくすことができます。それには、Register2 をそれ自体と、Register1 をそれ自体と XOR してそれらをゼロにしてから、次を使用して ADD を実行します。 2 つのレジスタ。XOR が機能するのは、1 ビットと XOR された 1 ビットがゼロに変わり、ゼロと XOR されたゼロがゼロのままになるためです。

条件付き分岐 BC 命令は、逆方向分岐を許可する場合と許可しない場合があります。そうでない場合、または何らかの制約がある場合は、ジャンプまたは JMP 命令を使用して、JMP を 1 回分岐するジャンプの前に BC 命令でループの先頭に戻る必要がある場合があります。 COUNT が 20 に達する。

START    L  R2,COUNT    // initialize Register 2 to zero as Count starts with zero
         L  R1,COUNT    // initialize Register 1 to zero as Count starts with zero
LOOP     A  R1,ONE      // add one as part of incrementing Count for the next sequence
         ST R1,COUNT    // save current Count back.
         A  R2,COUNT    // add the current value of Count into Register 2 for the sum
         C  R1,TWENTY   // compare Register 1, Count, to end of loop condition
         BC 3,LOOP      // branch if less than back to loop.  if 20 we are done.
         ST R2,SUM
         CH SUM
         STOP
COUNT    DC F'0'
ONE      DC F'1'
TWENTY   DC F'20'
SUM      DC F'0'
         END START
于 2012-09-21T03:43:01.333 に答える