@c %**end of header
@copying
-Copyright @copyright{} 2010-2018 j8takagi
+Copyright @copyright{} 2010-2023 j8takagi
@end copying
@dircategory Programming
@cartouche
@end iftex
@quotation
-@uref{http://www.jitec.jp/1_13download/shiken_yougo_ver2_2.pdf, 試験で使用する情報処理用語・プログラム言語など Ver 2.2(平成24年5月22日)}[PDFファイル]
+@uref{https://www.jitec.ipa.go.jp/1_13download/shiken_yougo_ver4_2.pdf, 情報処理技術者試験 情報処理安全確保支援士試験 試験で使用する情報技術に関する用語・プログラム言語など Ver 4.2}[PDFファイル]
+
別紙 1 アセンブラ言語の仕様
@end quotation
@iftex
また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。
YACASL2は、「ふつうの処理系」として動作します。
-ほかの多くのCASL IIエミュレータと違い、デバッガとして動作したり、
-コンピュータ内部の模式図を表示したりすることはありません。
-そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。
+YACASL2の操作は、端末上のコマンドラインインターフェイス(CLI)で操作します。
+YACASL2は、次のような動作内容をすべてテキストで出力します。
@itemize @bullet
実行時のメモリの内容
@end itemize
-出力された動作内容は、GNU/Linuxのさまざまなコマンド、
+YACASL2では、機械コードモニターを使い、動作中のCPUやメモリーを調べたりデバッグしたりすることもできます。
+
+また、出力された動作内容は、GNU/Linuxのさまざまなコマンド、
たとえば、@command{cat}、@command{less}、@command{grep}、@command{wc}などを使って解析できます。
-YACASL2の操作は、端末上のコマンドラインインターフェイスで行います。
+
@node Sample usage, casl2 invocation, Overview, Top
@chapter YACASL2の使用例
Assemble addl.casl (0)
Label::::
-MAIN.A ---> #0005
-MAIN.B ---> #0006
MAIN ---> #0000
+MAIN.A ---> #0007
+MAIN.B ---> #0008
+MAIN.C ---> #0009
Assemble addl.casl (1)
addl.casl: 1:;;; ADDL r,adr
addl.casl: 2:MAIN START
addl.casl: 3: LD GR1,A
#0000 #1010
- #0001 #0005
+ #0001 #0007
addl.casl: 4: ADDL GR1,B
#0002 #2210
- #0003 #0006
-addl.casl: 5: RET
- #0004 #8100
-addl.casl: 6:A DC 3
- #0005 #0003
-addl.casl: 7:B DC 1
- #0006 #0001
-addl.casl: 8: END
+ #0003 #0008
+addl.casl: 5: ST GR1,C
+ #0004 #1110
+ #0005 #0009
+addl.casl: 6: RET
+ #0006 #8100
+addl.casl: 7:A DC 3
+ #0007 #0003
+addl.casl: 8:B DC 2
+ #0008 #0002
+addl.casl: 9:C DS 1
+ #0009 #0000
+addl.casl: 10: END
@end example
なお、オプション@option{-A}を指定すると、アセンブル結果が表示される時点で処理が終了します。
-仮想マシンCOMET II での実行は行われません。
+仮想マシンCOMET IIでのプログラム実行はされません。
@node Register and memory, Only assemble, Assemble result, Sample usage
@section 実行時のレジスタとメモリを表示
* Step count:: プログラムのステップ数を表示
@end menu
-@file{addl.casl}ã\81«å¿\85è¦\81ã\81ªã\83¡ã\83¢ã\83ªå®¹é\87\8fã\81¯8èª\9eã\81®ã\81\9fã\82\81、次のようにCPUのレジスタとメモリの内容を表示できます。
+@file{addl.casl}ã\81§ã\81¯、次のようにCPUのレジスタとメモリの内容を表示できます。
@example
-$ @kbd{casl2 -t -d -M8 addl.casl | less}
+$ @kbd{casl2 -t -d -M16 addl.casl | less}
Assemble addl.casl (0)
#0000: GR5: 0 = #0000 = 0000000000000000
#0000: GR6: 0 = #0000 = 0000000000000000
#0000: GR7: 0 = #0000 = 0000000000000000
-#0000: SP: 8 = #0008 = 0000000000001000
+#0000: SP: 16 = #0010 = 0000000000010000
#0000: PR: 0 = #0000 = 0000000000000000
#0000: FR (OF SF ZF): 000
#0000: Memory::::
-#0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007
-#0000: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
+#0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+ -------------------------------------------------------------------------------------
+#0000: 0000: 1010 0007 2210 0008 1110 0009 8100 0003 0002 0000 0000 0000 0000 0000 0000 0000
+
#0002: Register::::
#0002: GR0: 0 = #0000 = 0000000000000000
#0002: GR1: 3 = #0003 = 0000000000000011
#0002: GR5: 0 = #0000 = 0000000000000000
#0002: GR6: 0 = #0000 = 0000000000000000
#0002: GR7: 0 = #0000 = 0000000000000000
-#0002: SP: 8 = #0008 = 0000000000001000
+#0002: SP: 16 = #0010 = 0000000000010000
#0002: PR: 2 = #0002 = 0000000000000010
#0002: FR (OF SF ZF): 000
#0002: Memory::::
-#0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007
-#0002: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
+#0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+ -------------------------------------------------------------------------------------
+#0002: 0000: 1010 0007 2210 0008 1110 0009 8100 0003 0002 0000 0000 0000 0000 0000 0000 0000
+
#0004: Register::::
#0004: GR0: 0 = #0000 = 0000000000000000
-#0004: GR1: 4 = #0004 = 0000000000000100
+#0004: GR1: 5 = #0005 = 0000000000000101
#0004: GR2: 0 = #0000 = 0000000000000000
#0004: GR3: 0 = #0000 = 0000000000000000
#0004: GR4: 0 = #0000 = 0000000000000000
#0004: GR5: 0 = #0000 = 0000000000000000
#0004: GR6: 0 = #0000 = 0000000000000000
#0004: GR7: 0 = #0000 = 0000000000000000
-#0004: SP: 8 = #0008 = 0000000000001000
+#0004: SP: 16 = #0010 = 0000000000010000
#0004: PR: 4 = #0004 = 0000000000000100
#0004: FR (OF SF ZF): 000
#0004: Memory::::
-#0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
-#0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
+#0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+ -------------------------------------------------------------------------------------
+#0004: 0000: 1010 0007 2210 0008 1110 0009 8100 0003 0002 0000 0000 0000 0000 0000 0000 0000
+
+#0006: Register::::
+#0006: GR0: 0 = #0000 = 0000000000000000
+#0006: GR1: 5 = #0005 = 0000000000000101
+#0006: GR2: 0 = #0000 = 0000000000000000
+#0006: GR3: 0 = #0000 = 0000000000000000
+#0006: GR4: 0 = #0000 = 0000000000000000
+#0006: GR5: 0 = #0000 = 0000000000000000
+#0006: GR6: 0 = #0000 = 0000000000000000
+#0006: GR7: 0 = #0000 = 0000000000000000
+#0006: SP: 16 = #0010 = 0000000000010000
+#0006: PR: 6 = #0006 = 0000000000000110
+#0006: FR (OF SF ZF): 000
+#0006: Memory::::
+#0006: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F
+ -------------------------------------------------------------------------------------
+#0006: 0000: 1010 0007 2210 0008 1110 0009 8100 0003 0002 0005 0000 0000 0000 0000 0000 0000
@end example
@node Register specify, End value, Register and memory, Register and memory
$ @kbd{casl2 -t addl.casl | grep 'GR1:'}
#0000: GR1: 0 = #0000 = 0000000000000000
#0002: GR1: 3 = #0003 = 0000000000000011
-#0004: GR1: 4 = #0004 = 0000000000000100
+#0004: GR1: 5 = #0005 = 0000000000000101
+#0006: GR1: 5 = #0005 = 0000000000000101
@end example
-この内容を、先に出力したアセンブル結果と引き比べてください。
+この内容を、先に出力したアセンブル結果と比較してください。
次の表のように、PRとGR1、命令行が対応していることがわかります。
@multitable @columnfractions .3 .3 .4
@item PR @tab GR1 @tab 命令行
@item #0000
@tab #0000
+@tab (なし)
@item #0002
@tab #0003
@tab @code{LD GR1,A}
@item #0004
@tab #0004
@tab @code{ADDL GR1,B}
+@item #0006
+@tab #0006
+@tab @code{ST GR1,C}
@end multitable
@node End value, Step count, Register specify, Register and memory
@command{grep}と@command{tail}を組み合わせれば、プログラム終了時の値を表示できます。
-@file{addl.casl}でプログラム終了時の値を確認するには、次のようにします。
+@file{addl.casl}でプログラム終了時のGR1の値を確認するには、次のようにします。
@example
$ @kbd{casl2 -t addl.casl | grep 'GR1:' | tail -1}
-#0004: GR1: 4 = #0004 = 0000000000000100
+#0006: GR1: 5 = #0005 = 0000000000000101
@end example
-@file{sum_10.casl}は、1から10までの整数の和を求めます。
+@file{sum_10.casl}ã\81¯ã\80\811ã\81\8bã\82\8910ã\81¾ã\81§ã\81®æ\95´æ\95°ã\81®å\92\8cã\82\92æ±\82ã\82\81ã\80\81GR2ã\81«æ ¼ç´\8dã\81\97ã\81¦ã\81\8bã\82\89ã\83¡ã\83¢ã\83ªã\81«ã\82¹ã\83\88ã\82¢ï¼\88æ\9b¸ã\81\8dè¾¼ã\81¿ï¼\89ã\81\97ã\81¾ã\81\99ã\80\82
@example
$ @kbd{cat sum_10.casl}
;;; sum_10.casl
-;;; 出力 GR0: 1から10までの整数をすべて加算した値
+;;; 1から10までの整数をすべて加算した値をメモリーに格納する
MAIN START
- PUSH 0,GR1
- LAD GR0,0 ; GR0を初期化
- LD GR1,FST ; GR1に初項を転送
-LOOP ADDL GR0,GR1 ; ループ先頭
+ XOR GR2,GR2 ; GR2を初期化
+ LD GR1,FST ; GR1に初項をメモリーから転送
+LOOP ADDL GR2,GR1 ; ループ先頭。GR2 <- GR2 + GR1
ADDL GR1,STEP ; GR1 <- GR1 + 公差
CPL GR1,LST ; GR1が末項より大きい場合は終了
JPL FIN ; ↓
JUMP LOOP ; ループ終端
-FIN POP GR1
+FIN ST GR2,RST ; GR2の結果をメモリーに転送
RET
FST DC 1 ; 初項
LST DC 10 ; 末項
STEP DC 1 ; 公差
+RST DS 1 ; 結果
END
@end example
-@file{sum_10.casl}ã\81§ã\83\95ã\82¡ã\82¤ã\83«çµ\82äº\86æ\99\82の値を確認するには、次のようにします。
+@file{sum_10.casl}ã\81§ã\83\97ã\83ã\82°ã\83©ã\83 çµ\82äº\86æ\99\82ã\81®GR2の値を確認するには、次のようにします。
@example
-$ @kbd{casl2 -t sum_10.casl | grep 'GR0:' | tail -1}
-#0010: GR0: 55 = #0037 = 0000000000110111 = '7'
+$ @kbd{casl2 -t sum_10.casl | grep 'GR2:' | tail -1}
+#000E: GR2: 55 = #0037 = 0000000000110111 = '7'
@end example
@node Step count, , End value, Register and memory
@file{sum_10.casl}はプログラム内にループがあるため、ステップ数が大きくなります。
@example
-$ @kbd{casl2 -t sum_10.casl | grep 'GR0:' | wc -l}
-54
+$ @kbd{casl2 -t sum_10.casl | grep 'GR2:' | wc -l}
+53
@end example
@node Only assemble, Analyze word, Register and memory, Sample usage
#0048: 72 = #0048 = 0000000001001000 = 'H'
@end example
-@unnumberedsubsec オプション
+@unnumberedsec オプション
@command{dumpword}は、次のオプションを指定できます。