アセンブラ言語の仕様

1 システム COMETIIの仕様

1.1 ハードウェアの仕様

  1. 1語は16ビットで、そのビット構成は、次のとおりである。
          上位8ビット                               下位8ビット
         | 15 | 14 | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |(ビット番号)
           ↑
         符号(負:1、非負:0)
    
  2. 主記憶の容量は65536語で、そのアドレスは0~65535番地である。
  3. 数値は、16ビットの2進数で表現する。負数は、2の補数で表現する。
  4. 制御方式は逐次制御で、命令語は1語長又は2語長である。
  5. レジスタとして、GR(16ビット)、SP(16ビット)、PR(16ビット)、FR(3ビット)の 4 種類がある。

    GR(汎用レジスタ、General Register)は、GR0GR7の8個があり、 算術、論理、比較、シフトなどの演算に用いる。 このうち、GR1GR7のレジスタは、指標レジスタ(index register) としてアドレスの修飾にも用いる。

    SP(スタックポインタ、Stack Pointer)は、 スタックの最上段のアドレスを保持している。

    PR(プログラムレジスタ、Program Register)は、 次に実行すべき命令語の先頭アドレスを保持している。

    FR(フラグレジスタ、Flag Register)は、 OF(Overflow Flag)、SF(Sign Flag)、ZF(Zero Flag)と呼ぶ 3個のビットからなり、演算命令などの実行によって次の値が設定される。 これらの値は、条件付き分岐命令で参照される。

    OF
    算術演算命令の場合は、演算結果が-32768~32767に収まらなくなったとき1になり、 それ以外のとき0になる。 論理演算命令の場合は、演算結果が0~65535に収まらなくなったとき1になり、 それ以外のとき0になる。
    SF
    演算結果の符号が負(ビット番号15が1)のとき1、それ以外のとき0になる。
    ZF
    演算結果が零(全部のビットが0)のとき1、それ以外のとき0になる。
  6. 論理加算又は論理減算は、被演算データを符号のない数値とみなして、 加算又は減算する。

1.2 命令

命令の形式及びその機能を示す。 ここで、一つの命令コードに対し2種類のオペランドがある場合、 上段はレジスタ間の命令、下段はレジスタと主記憶間の命令を表す。

  1. ロード、ストア、ロードアドレス命令

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定
    ロード
    LoaD
    LD r1,r2
    ——
    r,adr[,x]
    r1 ← (r2)
    ——
    r ← (実効アドレス)

    ただし、OFには0が設定される。
    ストア
    STore
    ST r,adr[,x] 実効アドレス ← (r)
    ロードアドレス
    Load ADdress
    LAD r,adr[,x] r ← 実効アドレス

  2. 算術、論理演算命令

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定
    算術加算
    ADD Arithmetic
    ADDA r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) + (r2)
    ——
    r ← (r) + (実効アドレス)

    論理加算
    ADD Logical
    ADDL r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) +L (r2)
    ——
    r ← (r) +L (実効アドレス)

    算術減算
    SUBtract Arithmetic
    SUBA r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) - (r2)
    ——
    r ← (r) - (実効アドレス)

    論理減算
    SUBtract Logical
    SUBL r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) - L(r2)
    ——
    r ← (r) - L(実効アドレス)

    論理積
    AND
    AND r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) AND (r2)
    ——
    r ← (r) AND (実効アドレス)

    ただし、OFには0が設定される。
    論理和
    OR
    OR r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) OR (r2)
    ——
    r ← (r) OR (実効アドレス)

    ただし、OFには0が設定される。
    排他的論理和
    eXclusive OR
    XOR r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) XOR (r2)
    ——
    r ← (r) XOR (実効アドレス)

    ただし、OFには0が設定される。

  3. 比較演算命令

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定
    算術比較
    ComPare Arithmetic
    CPAr1,r2
    ——
    r,adr[,x]
    (r1)(r2)、又は(r)(実効アドレス)の算術比較を行い、比較結果によって、FRに次の値を設定する。
    比較結果
    FRの値
    (r1) > (r2) 又は (r) > (実効アドレス)
    SF:0, ZF:0
    (r1) = (r2) 又は (r) = (実効アドレス)
    SF:0, ZF:1
    (r1) < (r2) 又は (r) < (実効アドレス)
    SF:1, ZF:0

    ただし、OFには0が設定される。
    論理比較
    ComPare Logical
    CPL r1,r2
    ——
    r,adr[,x]
    (r1)(r2)、又は(r)(実効アドレス)の論理比較を行い、比較結果によって、FRに次の値を設定する。
    比較結果
    FRの値
    (r1) > (r2) 又は (r) > (実効アドレス)
    SF:0, ZF:0
    (r1) = (r2) 又は (r) = (実効アドレス)
    SF:0, ZF:1
    (r1) < (r2) 又は (r) < (実効アドレス)
    SF:1, ZF:0

    ただし、OFには0が設定される。

  4. シフト演算命令

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定
    算術左シフト
    Shift Left Arithmetic
    SLA r,adr[,x] 符号を除き(r)を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果、空いたビット位置には、0が入る。
    ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。
    算術右シフト
    Shift Right Arithmetic
    SRA r,adr[,x] 符号を除き(r)を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には、符号と同じものが入る。
    ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。
    論理左シフト
    Shift Left Logical
    SLL r,adr[,x] 符号を含み(r)を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果,空いたビット位置には0が入る。
    ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。
    論理右シフト
    Shift Right Logical
    SRL r,adr[,x] 符号を含み(r)を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には0が入る。
    ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。

  5. 分岐命令

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定
    正分岐
    Jump on Plus
    JPL adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
    分岐するときのFRの値
    SF:0, ZF:0

    負分岐
    Jump on MINUS
    JMI adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
    分岐するときのFRの値
    SF:1

    非零分岐
    Jump on Non Zero
    JNZ adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
    分岐するときのFRの値
    ZF:0

    零分岐
    Jump on ZEro
    JZE adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
    分岐するときのFRの値
    ZF:1

    オーバーフロー分岐
    Jump on OVerflow
    JOV adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
    分岐するときのFRの値
    OF:1

    無条件分岐
    unconditional Jump
    JUMP adr[,x] 無条件に実効アドレスに分岐する。

  6. スタック操作命令

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定
    プッシュ
    PUSH
    PUSH adr[,x] SP ← (SP)-L1,
    (SP)← (実効アドレス)

    ポップ
    POP
    POP r r ← ( (SP) ),
    SP ← (SP) +L 1

  7. コール、リターン命令

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定
    コール
    CALL subroutine
    CALL adr[,x] SP ← (SP)-L 1,
    (SP) ← (PR),
    PR ← 実効アドレス

    リターン
    RETrun form subroutine
    RET PR ← ( (SP) ),
    SP ← (SP) +L 1

  8. その他

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定
    スーパーバイザコール
    SuperVisor CALL
    SVC adr[,x] 実効アドレスを引数として割出しを行う。実行後のGRFRは不定となる。
    ノーオペレーション
    No operation
    NOP 何もしない。