アセンブラ言語(CASLU)は基本情報技術者試験においてソフトウェア開発分野に関する試験問題に出題されるプログラム 言語のひとつです。とても原始的な言語で、直接メモリーを操作し、命令も基本的なものしかありません。
ハードウェアの仕様
1 語は 16 ビット。符号(負:1,非負:0)主記憶の容量は 65536 語で,そのアドレスは 0 〜 65535 番地である。 数値は,16 ビットの 2 進数で表現する。負数は,2 の補数で表現する。制御方式は逐次制御で,命令語は 1 語長又は 2 語長である。
レジスタとして,GR(16 ビット),SP(16 ビット),PR(16 ビット),FR(3 ビッ ト)の 4 種類がある。
GR(汎用レジスタ,General Register)は,GR0 〜 GR7 の 8 個があり,算術,論理, 比較,シフトなどの演算に用いる。このうち,GR1 〜 GR7 のレジスタは,指標レジスタ (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 になる。
命令
データの移動
ロード LoaD | LD r1,r2 | r1 ←(r2) | GRのr2に格納されているデータをGRのr1に格納する。FRのOFが0になる。 |
LD r,adr[,x] | r ←(実効アドレス) | アドレスのadrと指標レジスタのxを足した実効アドレスに格納されているデータをGRのrに格納する。FRのOFが0になる。 | |
ストアSTore | ST r,adr[,x] | 実効アドレス ←(r) | GRのrに格納されているデータをアドレスのadrと指標レジスタのxを足した実効アドレスに格納する。 |
ロードアドレスLoad ADdress | Load ADdress LAD r,adr[,x] | r ← 実効アドレス | アドレスのadrと指標レジスタのxを足した実効アドレスをGRのrに格納する。 |
算術演算
算術加算 ADD Arithmetic | ADDA r1,r2 | r1 ←(r1)+(r2) | GRのr1とr2を足した値をr1に格納する。 |
ADDA r,adr[,x] | r ←(r)+(実効アドレス) | GRのrと実効アドレスに格納されている値を足したものをrに格納する。 | |
算術減算 SUBtract Arithmetic | SUBA r1,r2 | r1 ←(r1)−(r2) | GRのr1とr2を引いた値をr1に格納する。 |
SUBA r,adr[,x] | r ←(r)−(実効アドレス) | GRのrと実効アドレスに格納されている値を引いたものをrに格納する。 |
論理演算
論理加算 ADD Logical | ADDL r1,r2 | r1 ←(r1)+L(r2) | GRのr1とr2を符号なしの数として足した値をr1に格納する。 |
ADDL r,adr[,x] | r ←(r)+L(実効アドレス) | GRのrと実効アドレスに格納されている値を符号なしの数として足したものをrに格納する。 | |
論理減算 SUBtract Logical | SUBL r1,r2 | r1 ←(r1)−L(r2) | GRのr1とr2を符号なしの数として引いた値をr1に格納する。 |
SUBL r,adr[,x] | r ←(r)−L(実効アドレス) | GRのrと実効アドレスに格納されている値を符号なしの数として引いたものをrに格納する。 | |
論理積 AND | AND r1,r2 | r1 ←(r1)AND(r2) | GRのr1とr2の論理積をr1に格納する。OF には 0 が設定される。 |
AND r,adr[,x] | GRのrと実効アドレスに格納されている値の論理積をrに格納する。OF には 0 が設定される。 | ||
論理和 OR | OR r1,r2 | r1 ←(r1)OR(r2) | GRのr1とr2の論理和をr1に格納する。OF には 0 が設定される。 |
OR r,adr[,x] | r ←(r)OR(実効アドレス) | GRのrと実効アドレスに格納されている値の論理和をrに格納する。OF には 0 が設定される。 | |
排他的論理和 eXclusive OR | XOR r1,r2 | r1 ←(r1)XOR(r2) | GRのr1とr2の排他的論理和をr1に格納する。OF には 0 が設定される。 |
XOR r,adr[,x] | r ←(r)XOR(実効アドレス) | GRのrと実効アドレスに格納されている値の排他的論理和をrに格納する。OF には 0 が設定される。 |
比較演算
算術比較 ComPare Arithmetic | CPA r1,r2 | GRのr1とr2の比較を行いその結果によってFRの値が変わる。OF には 0 が設定される。 | |
CPA r,adr[,x] | GRのrと実効アドレスに格納されている値の比較を行いその結果によってFRの値が変わる。OF には 0 が設定される。 | ||
論理比較 ComPare Logical | CPL r1,r2 | GRのr1とr2を符号なしの値として比較を行いその結果によってFRの値が変わる。OF には 0 が設定される。 | |
CPL r,adr[,x] | GRのrと実効アドレスに格納されている値を符号なしの値として比較を行いその結果によってFRの値が変わる。OF には 0 が設定される。 |
シフト演算
算術左シフト Shift Left Arithmetic | SLA r,adr[,x] | 符号を除きGRのrを実効アドレスで指定し たビット数だけ左にシフトする。シフトの結果,空いたビット位置には 0が入る。OF にはレジスタから最後に送り出 されたビットの値が設定される。 | |
算術右シフト Shift Right Arithmetic | SRA r,adr[,x] | 符号を除きGRのrを実効アドレスで指定し たビット数だけ右にシフトする。 シフトの結果,空いたビット位置には,符 号と同じものが入る。OF にはレジスタから最後に送り出 されたビットの値が設定される。 | |
論理左シフト Shift Left Logical | SLL r,adr[,x] | 符号を含みGRのrを実効アドレスで指定し たビット数だけ左にシフトする。 シフトの結果,空いたビット位置には 0 が入る。OF にはレジスタから最後に送り出 されたビットの値が設定される。 | |
論理右シフト Shift Right Logical | SRL r,adr[,x] | 符号を含みGRのrを実効アドレスで指定し たビット数だけ左右にシフトする。 シフトの結果,空いたビット位置には 0 が入る。OF にはレジスタから最後に送り出 されたビットの値が設定される。 |
分岐命令
正分岐 Jump on PLus | JPL adr[,x] | SF=0・ZF=0の時、実効アドレスに分岐す る。分岐しないときは,次の命令に進む。 | |
負分岐 Jump on MInus | JMI adr[,x] | SF=0の時、実効アドレスに分岐す る。分岐しないときは,次の命令に進む。 | |
非零分岐 Jump on Non Zero | JNZ adr[,x] | SF=0の時、実効アドレスに分岐す る。分岐しないときは,次の命令に進む。 | |
零分岐 Jump on ZEro | JZE adr[,x] | ZF=0の時、実効アドレスに分岐す る。分岐しないときは,次の命令に進む。 | |
オーバフロー分岐 Jump on OVerflow | JOV adr[,x] | OF=0の時、実効アドレスに分岐す る。分岐しないときは,次の命令に進む。 | |
無条件分岐 unconditional JUMP | JUMP adr[,x] | 無条件に実効アドレスに分岐する。 |
スタック操作
プッシュ PUSH | PUSH adr[,x] | SP ←(SP)−L 1, (SP)← 実効アドレス | SPの値を符号なしの値として-1してSPに格納し、実効アドレスの値ををSPが指し示すアドレスに格納する。 |
ポップ POP | POP r | r ←((SP)), SP ←(SP)+L 1 | SPの内容が指し示すアドレスに入っている値をGRのrに格納し、SPの値を符号なしの値として+1してSPに格納する。 |
コール・リターン命令
コール CALL subroutine | CALL adr[,x] | SP ←(SP)−L 1, (SP)←(PR), PR ← 実効アドレス | SPの値を符号なしの値として-1してSPに格納し、PRの値をSPが指し示すアドレスに格納し、実効アドレスをPRに格納する。 |
リターン RETurn from subroutine | RET | PR ←((SP)), SP ←(SP)+L 1 | SPの内容が指し示すアドレスに入っている値をPRに格納し、SPの値を符号なしの値として+1してSPに格納する。 |