プログラムで、数値を文字列にしたり、逆に文字列を数値にする方法は、具体的にどのように行われてるのか、気になったことってありますよね。
数値を文字列に変換する、または文字列を数値に変換することを「キャスト」する、といいます。
CASL2では、キャストを行う場合、ソフトウェア的に処理を組まなければなりません。
今回は、CASL2で数字を16進文字列に、16進文字列を数字に変換するプログラムを見てみたいと思います。
数値を16進文字列にキャスト
例1: 数値「26」を16進文字列にキャスト
1 | MAIN | START |
|
2 | | LD GR1, INT | ;数値をINT番地に格納
|
3 | | CALL INT2HEX | ;「INT2HEX」サブルーチンの呼び出し
|
4 | | OUT STR, STRLEN | ;STR番地開始の文字列を出力
|
5 | | RET |
|
6 | | |
|
7 | INT2HEX | LAD GR3, 3 | ;指標値
|
8 | LP | LD GR0, ='0' | ;「0」の文字コードをGR0に転送
|
9 | | LD GR2, GR1 | ;編集用に数値をGR2に転送
|
10 | | AND GR2, =#000F | ;数値の下位4ビット以外マスク
|
11 | | CPA GR2, =10 | ;数値と10を比較
|
12 | | JMI NUM | ;数値が10より小さいならNUMに移動
|
13 | | LD GR0, ='A' | ;「A」の文字コードをGR0に転送
|
14 | | SUBA GR2, =10 | ;編集用の数値から10を減算
|
15 | NUM | ADDA GR0, GR2 | ;文字コードに編集用の数値を加算
|
16 | | ST GR0, STR, GR3 | ;文字コードをSTRに格納
|
17 | | LAD GR3, -1, GR3 | ;指標値から1を減算
|
18 | | SRL GR1, 4 | ;数値を右4ビットシフト
|
19 | | CPA GR3, =0 | ;指標値と0を比較
|
20 | | JPL LP | ;指標値が0より大きいならLPに移動
|
21 | | JZE LP | ;指標値が0と同じならLPに移動
|
22 | | RET |
|
23 | | |
|
24 | INT | DC 26 | ;数値
|
25 | STR | DS 4 | ;文字列を入れる領域
|
26 | STRLEN | DC 4 | ;文字列の長さ
|
27 | | END |
|
シミュレータにそのままコピー&ペーストで使えます。
解説
数値を16進文字列にキャストは、数値を4ビット毎に16進数文字列に変換することでキャストを行っています。
対象データ16ビットの内、4ビット毎に値を見て行き
10以上であればアルファベットを、
10未満であれば数字を表す文字をメモリに格納する仕組みになっています。
数値26を16進文字列に変換するため、
「001A」が出力される、ということになります。
下記の文字コード表のように、「0、1、2、...、9」や「A、B、C、...、Z」の順番のようにコードも並んでいるので...
例えば、取得した4ビットのデータが
・(1)16ならば「0」の文字コードに +1
・(B)16ならば「A」の文字コードに +1
することで数値を文字列に対応するように処理しています。
それでは、トレースでデータの流れを見てみます。
例1のINT2HEX(7~22行)のトレース
初期状態
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
~1ループ目~
7行 LAD GR3, 3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
8行 LD GR0, ='0'
【汎用レジスタ】
GR0 | 110000 |
GR1 | 11010 |
GR2 | ? |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
GR0に「0」の文字コードを転送します。
9行 LD GR2, GR1
【汎用レジスタ】
GR0 | 110000 |
GR1 | 11010 |
GR2 | 11010 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
10行 AND GR2, =#000F
【汎用レジスタ】
GR0 | 110000 |
GR1 | 11010 |
GR2 | 1010 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
AND演算で、GR2の値が10になるためフラグレジスタに変化はありません。
※ GR2のデータを下位4ビットの桁を取得したいので、それ以外の桁は0になるようにマスクします。
11行 CPA GR2, =10
【汎用レジスタ】
GR0 | 110000 |
GR1 | 11010 |
GR2 | 1010 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
CPA命令で、GR1の値10と10を比較します。
10=10のためフラグレジスタが変化します。
12行 JMI NUM
【フラグレジスタ】
SFが0のため、JMI命令で指定されたラベル「NUM」に移動せず13行を処理します。
13行 LD GR0, ='A'
【汎用レジスタ】
GR0 | 1000001 |
GR1 | 11010 |
GR2 | 1010 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
GR0に「A」の文字コードを転送します。
14行 SUBA GR2, =10
【汎用レジスタ】
GR0 | 1000001 |
GR1 | 11010 |
GR2 | 0 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
GR2の値が0になるためフラグレジスタに変化はありません。
15行 ADDA GR0, GR2
【汎用レジスタ】
GR0 | 1000001 |
GR1 | 11010 |
GR2 | 0 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
GR0の値が(0041)16になるためフラグレジスタが変化します。
※ 「A」の文字コードに+0し、「A」の文字コードに変換します。
「A」の文字コードに0を足しても何も変わりませんね。
16行 ST GR0, STR, GR3
【汎用レジスタ】
GR0 | 1000001 |
GR1 | 11010 |
GR2 | 0 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
STR+3番地にGR0の値(0041)16を格納します。
17行 LAD GR3, -1, GR3
【汎用レジスタ】
GR0 | 1000001 |
GR1 | 11010 |
GR2 | 0 |
GR3 | 10 |
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
18行 SRL GR1, 4
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
GR1の値が1になるためフラグレジスタに変化はありません。
19行 CPA GR3, =0
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
CPA命令で、GR1の値 2と0を比較します。
2>0のためフラグレジスタに変化はありません。
20行 JPL LP
21行 JZE LP
【フラグレジスタ】
ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し8行を処理します。
前行でジャンプしているので21行は処理しません。
~2ループ目~
8行 LD GR0, ='0'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
GR0に「0」の文字コードを転送します。
9行 LD GR2, GR1
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
10行 AND GR2, =#000F
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
AND演算で、GR2の値が1になるためフラグレジスタに変化はありません。
11行 CPA GR2, =10
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
CPA命令で、GR2の値1と10を比較します。
1<10のためフラグレジスタが変化します。
12行 JMI NUM
【フラグレジスタ】
SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。
15行 ADDA GR0, GR2
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | |
STR+3 | 1000001 |
GR0の値が(0031)16になるためフラグレジスタが変化します。
16行 ST GR0, STR, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
ST命令で、STR+2番地に「1」の文字コードを格納します。
17行 LAD GR3, -1, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
18行 SRL GR1, 4
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が0になるためフラグレジスタが変化します。
19行 CPA GR3, =0
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR3の値1と0を比較します。
1>0のためフラグレジスタが変化します。
20行 JPL LP
21行 JZE LP
【フラグレジスタ】
ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し8行を処理します。
前行でジャンプしているので21行は処理しません。
~3ループ目~
8行 LD GR0, ='0'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
GR0に「0」の文字コードを転送します。
9行 LD GR2, GR1
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
10行 AND GR2, =#000F
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
AND演算で、GR2の値が0になるためフラグレジスタが変化します。
11行 CPA GR2, =10
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR2の値0と10を比較します。
0<10のためフラグレジスタが変化します。
12行 JMI NUM
【フラグレジスタ】
SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。
15行 ADDA GR0, GR2
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | |
STR+2 | 110001 |
STR+3 | 1000001 |
GR0の値が(0030)16になるためフラグレジスタが変化します。
16行 ST GR0, STR, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
ST命令で、STR+1番地に「0」の文字コードを格納します。
17行 LAD GR3, -1, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
18行 SRL GR1, 4
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が0になるためフラグレジスタが変化します。
19行 CPA GR3, =0
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR3の値0と0を比較します。
0=0のためフラグレジスタに変化はありません。
20行 JPL LP
21行 JZE LP
【フラグレジスタ】
ZFが1、SFが0のため、JPL命令で指定されたラベル「LP」に移動せず21行を処理します。
ZFが1のため、JZE命令で指定されたラベル「LP」に移動し8行を処理します。
~4ループ目~
8行 LD GR0, ='0'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR0に「0」の文字コードを転送します。
9行 LD GR2, GR1
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
10行 AND GR2, =#000F
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
AND演算で、GR2の値が0になるためフラグレジスタに変化はありません。
11行 CPA GR2, =10
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR2の値0と10を比較します。
0<10のためフラグレジスタが変化します。
12行 JMI NUM
【フラグレジスタ】
SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。
15行 ADDA GR0, GR2
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR0の値が(0030)16になるためフラグレジスタが変化します。
16行 ST GR0, STR, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
ST命令で、STR+0番地に「0」の文字コードを格納します。
17行 LAD GR3, -1, GR3
【汎用レジスタ】
GR0 | 110000 |
GR1 | 0 |
GR2 | 0 |
GR3 | 1111111111111111 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
18行 SRL GR1, 4
【汎用レジスタ】
GR0 | 110000 |
GR1 | 0 |
GR2 | 0 |
GR3 | 1111111111111111 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が0になるためフラグレジスタが変化します。
19行 CPA GR3, =0
【汎用レジスタ】
GR0 | 110000 |
GR1 | 0 |
GR2 | 0 |
GR3 | 1111111111111111 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR3の値-1と0を比較します。
-1<0のためフラグレジスタが変化します。
20行 JPL LP
21行 JZE LP
【フラグレジスタ】
ZFが0、SFが1のため、JPL命令で指定されたラベル「LP」に移動せず21行を処理します。
ZFが0のため、JZE命令で指定されたラベル「LP」に移動せず22行を処理します。
22行 RET
RET命令で、「INT2HEX」サブルーチンを抜けて、呼び出し元の「MAIN」サブルーチンに戻り処理が終了します。
この一連の処理によって、メモリは現在このようになっています。
STR+0 番地: (0030)16 = 「0」の文字コード
STR+1 番地: (0030)16 = 「0」の文字コード
STR+2 番地: (0031)16 = 「1」の文字コード
STR+3 番地: (0041)16 = 「A」の文字コード
最後にOUT命令で、STR+0~STR+3番地まで出力され
「001A」と表示されます。
(001A)16 = 26
したがって、正しい答えになっていますね。
16進文字列を数値にキャスト
例2: 16進文字列「001A」を数値にキャスト
1 | MAIN | START |
|
2 | | CALL HEX2INT | ;「HEX2INT」サブルーチンの呼び出し
|
3 | | ST GR0, INT | ;答えの数値をINT番地に格納
|
4 | | RET |
|
5 | | |
|
6 | HEX2INT | LAD GR0, 0 | ;GR0を答えの格納用に初期化
|
7 | | LAD GR2, 12 | ;シフト数
|
8 | | LAD GR3, 0 | ;指標値
|
9 | LP | LD GR1, STR, GR3 | ;STR+指標値番地から文字コードを転送
|
10 | | CPA GR1, ='A' | ;文字コードと「A」の文字コードを比較
|
11 | | JMI NUM | ;文字コードが「A」の文字コードより小さいならNUMに移動
|
12 | | SUBA GR1, ='A' | ;文字コードから「A」の文字コードを減算
|
13 | | LAD GR1, 10, GR1 | ;文字コードに10を加算
|
14 | | JUMP NX |
|
15 | NUM | SUBA GR1, ='0' | ;文字コードに「0」の文字コードを減算
|
16 | NX | SLL GR1, 0, GR2 | ;文字コードをシフト数分左シフト
|
17 | | ADDA GR0, GR1 | ;答えに文字コードを加算
|
18 | | SUBA GR2, =4 | ;シフト数から4を減算
|
19 | | LAD GR3, 1, GR3 | ;指標値をインクリメント
|
20 | | JPL LP | ;シフト数が0より大きいならLPに移動
|
21 | | JZE LP | ;シフト数が0と同じならLPに移動
|
22 | | RET |
|
23 | | |
|
24 | STR | DC '001A' | ;文字列
|
25 | INT | DS 1 | ;数値を入れる領域
|
26 | | END |
|
シミュレータにそのままコピー&ペーストで使えます。
解説
16進文字列を数値にキャストは、数値から文字コードを減算することで、16進文字列から元の値を取得することでキャストを行っています。
文字コードから
特定の数値を引き算することで元の数値を取得します。
特定の数値を引き算するとは、例えば以下のような処理を指します。
文字「1」のコード(0031)
16から、文字「0」のコード(0030)
16を差し引くと、1が残ります。
・(0031)16 - (0030)16 = 1
また、文字「B」のコード(0042)
16から、文字「A」のコード(0041)
16を差し引くと、1が残ります。
その後、
「B」は、16進の
11に相当しますので、1に
10を加え、11になるように処理しています。
・(0031)16 - (0030)16 = 1
その後、1 + 10 = 11
上記のように処理することで、文字から数値を取り出しています。
それでは、以下のトレースで、データを追ってみたいと思います。
これも非常に長いので、興味のある方は見てみてください。
例2のHEX2INT(6~22行)のトレース
初期状態
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
~1ループ目~
9行 LD GR1, STR, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
10行 CPA GR1, ='A'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR1の値「0」の文字コード と「A」の文字コードを比較します。
(0030)16<(0041)16のためフラグレジスタが変化します。
11行 JMI NUM
【フラグレジスタ】
SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。
15行 SUBA GR1, ='0'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が0になるためフラグレジスタが変化します。
16行 SLL GR1, 0, GR2
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が0になるためフラグレジスタに変化はありません。
※ 0をいくらシフトしても0のままですね。
17行 ADDA GR0, GR1
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR0の値が0になるためフラグレジスタに変化はありません。
18行 SUBA GR2, =4
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR2の値が8になるためフラグレジスタが変化します。
19行 LAD GR3, 1, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
20行 JPL LP
21行 JZE LP
【フラグレジスタ】
ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し9行を処理します。
前行でジャンプしているので21行は処理しません。
~2ループ目~
9行 LD GR1, STR, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
10行 CPA GR1, ='A'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR1の値 「0」の文字コードと「A」の文字コードを比較します。
(0030)16<(0041)16のためフラグレジスタが変化します。
11行 JMI NUM
【フラグレジスタ】
SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。
15行 SUBA GR1, ='0'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が0になるためフラグレジスタが変化します。
16行 SLL GR1, 0, GR2
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が0になるためフラグレジスタに変化はありません。
17行 ADDA GR0, GR1
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR0の値が0になるためフラグレジスタに変化はありません。
18行 SUBA GR2, =4
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR2の値が4になるためフラグレジスタが変化します。
19行 LAD GR3, 1, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
20行 JPL LP
21行 JZE LP
【フラグレジスタ】
ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し9行を処理します。
前行でジャンプしているので21行は処理しません。
~3ループ目~
9行 LD GR1, STR, GR3
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
10行 CPA GR1, ='A'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR1の値 「1」の文字コード と「A」の文字コードを比較します。
(0031)16<(0041)16のためフラグレジスタが変化します。
11行 JMI NUM
【フラグレジスタ】
SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。
15行 SUBA GR1, ='0'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が1になるためフラグレジスタが変化します。
16行 SLL GR1, 0, GR2
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が16になるためフラグレジスタに変化はありません。
17行 ADDA GR0, GR1
【汎用レジスタ】
GR0 | 10000 |
GR1 | 10000 |
GR2 | 100 |
GR3 | 10 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR0の値が16になるためフラグレジスタに変化はありません。
18行 SUBA GR2, =4
【汎用レジスタ】
GR0 | 10000 |
GR1 | 10000 |
GR2 | 0 |
GR3 | 10 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR2の値が0になるためフラグレジスタが変化します。
19行 LAD GR3, 1, GR3
【汎用レジスタ】
GR0 | 10000 |
GR1 | 10000 |
GR2 | 0 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
20行 JPL LP
21行 JZE LP
【フラグレジスタ】
ZFが1、SFが0のため、JPL命令で指定されたラベル「LP」に移動せず21行を処理します。
ZFが1のため、JZE命令で指定されたラベル「LP」に移動し9行を処理します。
~4ループ目~
9行 LD GR1, STR, GR3
【汎用レジスタ】
GR0 | 10000 |
GR1 | 1000001 |
GR2 | 0 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
10行 CPA GR1, ='A'
【汎用レジスタ】
GR0 | 10000 |
GR1 | 1000001 |
GR2 | 0 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
CPA命令で、GR1の値「A」の文字コードと「A」の文字コードを比較します。
「A」の文字コード=「A」の文字コードのためフラグレジスタに変化はありません。
11行 JMI NUM
【フラグレジスタ】
ZFが1のため、JMI命令で指定されたラベル「NUM」に移動せず12行を処理します。
12行 SUBA GR1, ='A'
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が0になるためフラグレジスタに変化はありません。
13行 LAD GR1, 10, GR1
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
JUMP NX
JUMP命令でラベル「NX」に移動し16行から処理します。
16行 SLL GR1, 0, GR2
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR1の値が10になるためフラグレジスタが変化します。
17行 ADDA GR0, GR1
【汎用レジスタ】
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR0の値が26になるためフラグレジスタに変化はありません。
18行 SUBA GR2, =4
【汎用レジスタ】
GR0 | 11010 |
GR1 | 1010 |
GR2 | 1111111111111100 |
GR3 | 11 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
GR2の値が-4になるためフラグレジスタが変化します。
19行 LAD GR3, 1, GR3
【汎用レジスタ】
GR0 | 11010 |
GR1 | 1010 |
GR2 | 1111111111111100 |
GR3 | 100 |
【フラグレジスタ】
【メモリ】
STR+0 | 110000 |
STR+1 | 110000 |
STR+2 | 110001 |
STR+3 | 1000001 |
20行 JPL LP
21行 JZE LP
【フラグレジスタ】
ZFが0、SFが1のため、JPL命令で指定されたラベル「LP」に移動せず21行を処理します。
ZFが0のため、JZE命令で指定されたラベル「LP」移動せず22行を処理します。
22行 RET
RET命令で、「HEX2INT」サブルーチンを抜けて、呼び出し元の「MAIN」サブルーチンに戻り処理が終了します。
以上で処理が終了し、GR0に答えが格納されています。
GR0: 11010 = (001A)16
正しい答えが格納されていますね。
最後に
今回は16進数のキャストについてでした。
キャストするだけで、こんな処理が行われているんですね。
まったく、高級言語は開発コストを大幅に削減できる素晴らしい発明ですねえ。
続きはまた次回にご期待を!