アセンブリ言語(続き)

さらなる例

ということで、例です。
     TIY 1
     MA
     TIY 0
     M+
L1:  AO
L2:  JUMP L2
...
50: 3
51: 4
これの読み方の詳細はやはり 学研の「大人の科学」 No.24 ふろく4ビットマイコン 等をみてみてください(_ _)
下のほうにある 50:, 51: は、そのアドレスのメモリに 3,4 を置け、という意 味です。このためには、

「5」「0」「A SET」

とボタンを押して、そのあと

「3」「INCR」「4」「INCR」

と押せばよいです。その後で

「RESET」「1」「RUN」

で実行できます。
  1. まず、
    
        TIY 1
    
    
    で、Yレジスタに1という値をロード(代入)します。レジスタ(メモリ)の 内容を、そのまま1にする、ということです。

  2. 次に、
    
        MA
    
    
    で、データメモリ(このCPUでは 50にYレジスタの値を足した数の番 地 という約束です。なので、この場合は51番地)のデータをAレジス タにロードする、という約束です。この時点で、Yは1ですから51番地の値 をもってくる、ということでAレジスタの値は4になるわけです。
    このCPUにおいて、Yレジスタはデータ用メモリ領域のインデックス(メモリ上 のどのデータを処理の対象としているか)を持つもの、と覚えておけばよいで しょう。

    同様に、このCPUにおいて、Aレジスタはデータ処理用の作業領域の役目、と覚 えておけばよいでしょう。

  3. 次に、
    
        TIY 0
    
    
    で、Yレジスタに0という値をロードします。

  4. 次に、
    
        M+
    
    
    これは、「Aレジスタにデータメモリ(50にYレジスタの値を足した数の番 地なので、この場合は50番地)のデータを加えて、その結果をAレジスタに 置いておく(もし桁上がりすれば実行フラグが1になる)」という意味です。 ここではYは0なので、50番地の値3を、Aレジスタの値4に加えて、その 結果7をAレジスタにおきます。

  5. ということで
    
    L1:  AO
    
    
    これは、「Aレジスタの値を数字 LED に表示する」ということですので、ここ では加算された結果の7を表示します。この命令はかならず実行レジスタを1 にします。

  6. 最後に
    
    L2: JUMP L2
    
    
    これは、「実行フラグが1の場合、ラベル L3 が示すアドレスに制御を移す」 ということで、前の命令で実行フラグは1になったのでこの命令を実行する、 ということは、自分自身を再度実行せよ、ということになります。つまりここ で無限ループとなり、プログラム終了です。

ということで、これは、50番地と51番地におかれている数の和を計算するプロ グラムです。前の例では足される数がプログラムの中に埋め込まれていました が、このプログラムでは 50,51 番地に任意の数をおいておくことで、それらの 和を計算するという、柔軟なプログラムになっています。

さらに、例

ということで、さらに改良版です。
     TIY 1
     MA
     TIY 0
     M+
     JUMP L1
     JUMP L2
L1:  TIY 0
     CAL SETR
L2:  AO
L3:  JUMP L3
...
50: 3
51: 4
上のプログラムにさらに数行増えています。その差の部分を中心に説明します。
  1. 
        M+
    
    
    までは上のプログラムと同じです。これは、「Aレジスタにデータメモリのデー タを加えて、その結果をAレジスタに置いておく(もし桁上がりすれば実行フ ラグが1になる)」という意味でした。ここではYは0なので、50番地の値 3を、Aレジスタの値4に加えて、その結果7をAレジスタにおきます。この 場合には、桁溢れはありませんでしたのでフラグは0です。

  2. 次に、
    
        JUMP L1
    
    
    これは、「ラベルL1が示すアドレスに、実行フラグが1の場合、指定されたア ドレスに制御を移す(そこに飛んで、処理を続ける)」ということです。しか し、前の命令では実行フラグは0だったのでこの命令はなにも実行レジスタを 1するだけで他の動作はせず、次の命令を読みにいきます。

  3. 次に、
    
        JUMP L2
    
    
    これは、「ラベルL2が示すアドレスに、実行フラグが1の場合、指定されたア ドレスに制御を移す」ということで、前の命令では実行フラグは1だったので この命令を実行し、L2番地の命令を実行しようとします。

    ちなみに次の2命令 はこの場合は飛ばされたわけですが、これらは桁あふれした時にLED を点灯す るという処理になっています。

50,51 番地の値はそれぞれ 0 から F の値を持ちうるわけで、当然、場合によっ ては結果が F より大きい (10以上、最大 1E) 値になります。その場合に、 2桁目が「1」であるということを示すために、上でスキップされた命令

L1:  TIY 0
     CAL SETR

で、LED を点灯させる、という仕組みです。
さらにもう少しだけ、アセンブリ言語   目次にもどる
講義用スタイル
印刷用スタイル