アセンブリ言語を触ってた時のメモ

 玉田研のざきもとです。3日前にプロジェクト演習の内容を知ってそのあと3日間アセンブラ触ってたので備忘録として簡単に命令の使い方とか書いていく。今回アセンブラ書くのに使うP88の参考資料がやさしいコンピュータ科学だったのでそれとか読んでアセンブラ書いたりしてた。ちなみにこれまで理工学実験くらいでしかアセンブラ触ったことないので経験的にはプロ演受講者と変わらない感じ。あと先生も言ってたけどこういう個人の勉強用のメモを学習教材にする感じはよくないので受講者はちゃんと授業資料とか参考書籍読んで勉強してほしい(説明とか間違ってる可能性もある)

やさしいコンピュータ科学 (Ascii books)

やさしいコンピュータ科学 (Ascii books)

IN OUT(入力,出力)

  • IN
  • OUT

  • サンプルコード

    IN  AX
    OUT AX

COPY(値のコピー)

  • COPY
    • 指定した位置のメモリの内容をコピーする

サンプルコードでは,AXの内容がコピーされたBXが出力される。

  • サンプルコード
    IN AX
    IN BX
    COPY BX,AX ;BXにAXの内容をコピー
    OUT BX

ADD,SUB,MUL,DIV(算術演算)

  • ADD
    • 第1引数の値に第2引数の内容を加算する
  • SUB
    • 第1引数の値に第2引数の内容を減算する
  • MUL
    • 第1引数の値に第2引数の内容を乗算する
  • DIV
    • 第1引数の値に第2引数の内容を除算する

サンプルコードでは,AXにBXの数値を加算したものが表示される。

  • サンプルコード
    IN  AX
    IN  BX
    ADD  AX,BX ;AXにBXを加算
    OUT AX

JMP,END(ジャンプと終了)

    IN AX
    IN BX
    JMP LAB1 ;LAB1ラベルまでジャンプ
    ADD AX,BX ;ジャンプされるので命令は無視される
    OUT AX
LAB1 END ;プログラムの終了

CMP,JNB,JB(比較)

  • CMP

    • 二つの整数の値を比較する
  • JNB

    • 2つ目の数字の方が小さい場合ジャンプ
  • JB
    • 1つ目の数字の方が小さい場合ジャンプ

サンプルプログラム

      IN AX
      IN BX
      CMP AX,BX ;AXとBXの大きさを比較
      JNB LAB1 ;AXよりBXの方が小さい場合ジャンプ
      END ;プログラムの終了
LAB1  OUT AX

ラベル

    IN AX
    COPY AAA,AX
    ADD AX,AAA
    OUT AX
    END

このプログラムを実行すると以下のような警告文が出る。

$ ./p88 label.p88
!!Undefined Label ... Memory allocated: AAA = [9], Line=2

これはAAAのラベルが定義されてねーよみたいな警告。
汎用レジスタである,AX,BX,CX,DXを使えば出ないけど,それ以外だと未定義ラベルの警告文が出る。
これが出てもp88は自動でメモリを割り当てるからある程度のプログラムは実行はできるし挙動は特に問題ないけど実際のアセンブラのプログラムではこれだと実行できないらしい。なのでラベルをちゃんと定義する。とりあえずコピーするだけなのでAAAには0を代入しておく

    IN AX
    COPY AAA,AX
    ADD AX,AAA
    OUT AX
    END
AAA 0 ;AAAに0を定義

これで警告は消えて問題なく実行できる。

ここまで理解できれば演習の問題は多分全部できるはずなので頑張って。