#はじめに
前回に引き続きCASL2をやっていきます。今回は簡単な演算をやります。
#CASL2について
COMET2は1語(ひとつのデータ)を16ビットとし、#0000~#FFFF(0~65535)まで表すことができます。また、命令語は2語長で32ビット構成です。
#2の補数表現について
2の補数でマイナスの表現ができます。
2の補数とはビット反転し1を加えた値のことを言います。
例)-9を2の補数表現で表す。
9 = (1001)₂
ビット反転すると (0110)₂
さらに1を加えて (0111)₂
よって-9 = (0111)₂
#コード1(ADDA命令,SUBA命令)
PULAS START ;プログラムの開始
LD GR0, DATA1 ;GR0にDATA1を格納
ADDA GR0, DATA2 ;GR0にGR0+DATA2を格納
ST GR0, KOTAEA ;KOTAEAにGR0を格納
RET
DATA1 DC #FFFF
DATA2 DC 1
KOTAEA DS 1 ;データ領域の確保
KOTAES DS 1
END
##LD命令、ST命令
LD命令はメモリから凡用レジスタにデータを格納します。
ST命令は凡用レジスタからメモリにデータを格納します。
いずれの場合も、オペランドはレジスタとアドレスです。
##DS命令
DS命令はオペランドで指定した値の分だけデータ領域を確保します。
##ADDA命令、SUBA命令
指定したレジスタとアドレスの値を足して(引いて)レジスタに格納します。
ADDA命令、SUBA命令では最上位ビットを符号として表します。
そのため #FFFF=-1 となるため上のコードでは
GR0 = #FFFF(-1) + #0001(1) = 0 となります。
#コード2(ADDL命令,SUBL命令)
PULAS START ;プログラムの開始
LD GR0, DATA1 ;GR0にDATA1を格納
ADDL GR0, DATA2 ;GR0にGR0+DATA2を格納
ST GR0, KOTAEA ;KOTAEAにGR0を格納
RET
DATA1 DC #FFFF
DATA2 DC 1
KOTAEA DS 1 ;データ領域の確保
KOTAES DS 1
END
##ADDL命令、SUBL命令
指定したレジスタとアドレスの値を足して(引いて)レジスタに格納します。
ただし、ADDL命令、SUBL命令は符号なしで考えます。
そのため、#FFFF = 65535(2¹⁶-1) となり、上のコードでは
GR0 = #FFFF(65535) + #0001(1) = #10000(65536) となります。
ひとつのデータは16ビットであるのでオーバーフローとなります。
なので、GR0は0、OFに1が格納されます。
#コード(AND命令、OR命令、XOR命令)
LOGIC START
LD GR0, DATA
AND GR0, DATA2
RET
DATA DC 13
DATA2 DC 8
END
##AND命令
指定したレジスタとアドレスの値で論理積を行い、レジスタに格納します。
DATA,DATA2を2進数で表すと 13 = (1101)₂、8 = (1000)₂ となります。
よって GR0 = (1000)₂ = 8 となります。
論理和、排他的論理和も同様になります。
#終わり
#~は16進数、(~)₂は2進数をあらわします。次回は分岐条件をやろうと思います。