ニッシー
1990年生まれ
血液型 O型

こんにちは。ITブログアルケーナム管理人のニッシーです。

詳細プロフィールへ

お問い合わせへ






2018-07-16

CASL2で16進数のキャスト方法




今回は、CASL2で数字を16進文字列に、16進文字列を数字に変換するプログラムを見ていこうと思います。


CASL2ではキャストする際にもロジックを組まなくてはなりません。










数値を16進文字列に変換



例1: 数値「26」を16進文字列にキャスト


1 MAIN START 
2   LD GR1, INT 
3   CALL 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 
15 NUM ADDA GR0, GR2 
16   ST GR0, STR, GR3 
17   LAD GR3, -1, GR3 ;指標値をデクリメント
18   SRL GR1, 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 


シミュレータにそのままコピー&ペーストで使えます。



解説



このプログラムは、数値を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行)のトレース



初期状態

【汎用レジスタ】
GR0?
GR111010
GR2?
GR3?

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+3



~1ループ目~

7行 LAD GR3, 3

【汎用レジスタ】
GR0?
GR111010
GR2?
GR311

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+3



8行 LD GR0, ='0'

【汎用レジスタ】
GR0110000
GR111010
GR2?
GR311

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+3

GR0に「0」の文字コードを転送します。



9行 LD GR2, GR1

【汎用レジスタ】
GR0110000
GR111010
GR211010
GR311

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+3



10行 AND GR2, =#000F

【汎用レジスタ】
GR0110000
GR111010
GR21010
GR311

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+3

AND演算で、GR2の値が10になるためフラグレジスタに変化はありません。

※ GR2のデータを下位4ビットの桁を取得したいので、それ以外の桁は0になるようにマスクします。



11行 CPA GR2, =10

【汎用レジスタ】
GR0110000
GR111010
GR21010
GR311

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1
STR+2
STR+3

CPA命令で、GR1の値10と10を比較します。
10=10のためフラグレジスタが変化します。



12行 JMI NUM

【フラグレジスタ】
ZFSFOF
100

SFが0のため、JMI命令で指定されたラベル「NUM」に移動せず13行を処理します。



13行 LD GR0, ='A'

【汎用レジスタ】
GR01000001
GR111010
GR21010
GR311

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1
STR+2
STR+3

GR0に「A」の文字コードを転送します。



14行 SUBA GR2, =10

【汎用レジスタ】
GR01000001
GR111010
GR20
GR311

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1
STR+2
STR+3

GR2の値が0になるためフラグレジスタに変化はありません。



15行 ADDA GR0, GR2

【汎用レジスタ】
GR01000001
GR111010
GR20
GR311

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+3

GR0の値が(0041)16になるためフラグレジスタが変化します。

「A」の文字コードに+0し、「A」の文字コードに変換します。
「A」の文字コードに0を足しても何も変わりませんね。



16行 ST GR0, STR, GR3

【汎用レジスタ】
GR01000001
GR111010
GR20
GR311

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+31000001

STR+3番地にGR0の値(0041)16を格納します。



17行 LAD GR3, -1, GR3

【汎用レジスタ】
GR01000001
GR111010
GR20
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+31000001



18行 SRL GR1, 4

【汎用レジスタ】
GR01000001
GR11
GR20
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+31000001

GR1の値が1になるためフラグレジスタに変化はありません。



19行 CPA GR3, =0

【汎用レジスタ】
GR01000001
GR11
GR20
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+31000001

CPA命令で、GR1の値 2と0を比較します。
2>0のためフラグレジスタに変化はありません。



20行 JPL LP
21行 JZE LP

【フラグレジスタ】
ZFSFOF
000

ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し8行を処理します。
前行でジャンプしているので21行は処理しません。



~2ループ目~

8行 LD GR0, ='0'

【汎用レジスタ】
GR0110000
GR11
GR20
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+31000001

GR0に「0」の文字コードを転送します。



9行 LD GR2, GR1

【汎用レジスタ】
GR0110000
GR11
GR21
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+31000001



10行 AND GR2, =#000F

【汎用レジスタ】
GR0110000
GR11
GR21
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+31000001

AND演算で、GR2の値が1になるためフラグレジスタに変化はありません。




11行 CPA GR2, =10

【汎用レジスタ】
GR0110000
GR11
GR21
GR310

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0
STR+1
STR+2
STR+31000001

CPA命令で、GR2の値1と10を比較します。
1<10のためフラグレジスタが変化します。



12行 JMI NUM

【フラグレジスタ】
ZFSFOF
010

SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。



15行 ADDA GR0, GR2

【汎用レジスタ】
GR0110001
GR11
GR21
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2
STR+31000001

GR0の値が(0031)16になるためフラグレジスタが変化します。



16行 ST GR0, STR, GR3

【汎用レジスタ】
GR0110001
GR11
GR21
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001

ST命令で、STR+2番地に「1」の文字コードを格納します。



17行 LAD GR3, -1, GR3

【汎用レジスタ】
GR0110001
GR11
GR21
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001



18行 SRL GR1, 4

【汎用レジスタ】
GR0110001
GR10
GR21
GR31

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001

GR1の値が0になるためフラグレジスタが変化します。



19行 CPA GR3, =0

【汎用レジスタ】
GR0110001
GR10
GR21
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001

CPA命令で、GR3の値1と0を比較します。
1>0のためフラグレジスタが変化します。



20行 JPL LP
21行 JZE LP

【フラグレジスタ】
ZFSFOF
000

ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し8行を処理します。
前行でジャンプしているので21行は処理しません。



~3ループ目~

8行 LD GR0, ='0'

【汎用レジスタ】
GR0110000
GR10
GR21
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001

GR0に「0」の文字コードを転送します。



9行 LD GR2, GR1

【汎用レジスタ】
GR0110000
GR10
GR20
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001



10行 AND GR2, =#000F

【汎用レジスタ】
GR0110000
GR10
GR20
GR31

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001

AND演算で、GR2の値が0になるためフラグレジスタが変化します。



11行 CPA GR2, =10

【汎用レジスタ】
GR0110000
GR10
GR20
GR31

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001

CPA命令で、GR2の値0と10を比較します。
0<10のためフラグレジスタが変化します。



12行 JMI NUM

【フラグレジスタ】
ZFSFOF
010

SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。



15行 ADDA GR0, GR2

【汎用レジスタ】
GR0110000
GR10
GR20
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1
STR+2110001
STR+31000001

GR0の値が(0030)16になるためフラグレジスタが変化します。



16行 ST GR0, STR, GR3

【汎用レジスタ】
GR0110000
GR10
GR20
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001

ST命令で、STR+1番地に「0」の文字コードを格納します。




17行 LAD GR3, -1, GR3

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001



18行 SRL GR1, 4

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001

GR1の値が0になるためフラグレジスタが変化します。



19行 CPA GR3, =0

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001

CPA命令で、GR3の値0と0を比較します。
0=0のためフラグレジスタに変化はありません。



20行 JPL LP
21行 JZE LP

【フラグレジスタ】
ZFSFOF
100

ZFが1、SFが0のため、JPL命令で指定されたラベル「LP」に移動せず21行を処理します。

ZFが1のため、JZE命令で指定されたラベル「LP」に移動し8行を処理します。




~4ループ目~

8行 LD GR0, ='0'

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001

GR0に「0」の文字コードを転送します。



9行 LD GR2, GR1

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001



10行 AND GR2, =#000F

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001

AND演算で、GR2の値が0になるためフラグレジスタに変化はありません。



11行 CPA GR2, =10

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001

CPA命令で、GR2の値0と10を比較します。
0<10のためフラグレジスタが変化します。



12行 JMI NUM

【フラグレジスタ】
ZFSFOF
010

SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。



15行 ADDA GR0, GR2

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0
STR+1110000
STR+2110001
STR+31000001

GR0の値が(0030)16になるためフラグレジスタが変化します。



16行 ST GR0, STR, GR3

【汎用レジスタ】
GR0110000
GR10
GR20
GR30

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

ST命令で、STR+0番地に「0」の文字コードを格納します。



17行 LAD GR3, -1, GR3

【汎用レジスタ】
GR0110000
GR10
GR20
GR31111111111111111

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



18行 SRL GR1, 4

【汎用レジスタ】
GR0110000
GR10
GR20
GR31111111111111111

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が0になるためフラグレジスタが変化します。



19行 CPA GR3, =0

【汎用レジスタ】
GR0110000
GR10
GR20
GR31111111111111111

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

CPA命令で、GR3の値-1と0を比較します。
-1<0のためフラグレジスタが変化します。



20行 JPL LP
21行 JZE LP

【フラグレジスタ】
ZFSFOF
010

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 
3   ST GR0, 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' 
13   LAD GR1, 10, GR1 ;文字コードに10を加算
14   JUMP NX 
15 NUM SUBA GR1, ='0' 
16 NX SLL GR1, 0, GR2 ;文字コードをシフト数分左シフト
17   ADDA GR0, GR1 
18   SUBA GR2, =4 
19   LAD GR3, 1, GR3 ;指標値をインクリメント
20   JPL LP 
21   JZE LP 
22   RET 
23    
24 STR DC '001A' ;文字列
25 INT DS 1 ;数値を入れる領域
26   END 


シミュレータにそのままコピー&ペーストで使えます。



解説



このプログラムは、文字データから特定の数値を引き算するなどすることで元の値を取得します。


特定の数値を引き算するとは例えば以下のような処理を指します。



文字「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行)のトレース



初期状態

【汎用レジスタ】
GR00
GR1?
GR21100
GR30

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



~1ループ目~

9行 LD GR1, STR, GR3

【汎用レジスタ】
GR00
GR1110000
GR21100
GR30

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



10行 CPA GR1, ='A'

【汎用レジスタ】
GR00
GR1110000
GR21100
GR30

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

CPA命令で、GR1の値「0」の文字コード と「A」の文字コードを比較します。
(0030)16<(0041)16のためフラグレジスタが変化します。



11行 JMI NUM

【フラグレジスタ】
ZFSFOF
010

SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。



15行 SUBA GR1, ='0'

【汎用レジスタ】
GR00
GR10
GR21100
GR30

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が0になるためフラグレジスタが変化します。



16行 SLL GR1, 0, GR2

【汎用レジスタ】
GR00
GR10
GR21100
GR30

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が0になるためフラグレジスタに変化はありません。

※ 0をいくらシフトしても0のままですね。



17行 ADDA GR0, GR1

【汎用レジスタ】
GR00
GR10
GR21100
GR30

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR0の値が0になるためフラグレジスタに変化はありません。



18行 SUBA GR2, =4

【汎用レジスタ】
GR00
GR10
GR21000
GR30

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR2の値が8になるためフラグレジスタが変化します。



19行 LAD GR3, 1, GR3

【汎用レジスタ】
GR00
GR10
GR21000
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



20行 JPL LP
21行 JZE LP

【フラグレジスタ】
ZFSFOF
000

ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し9行を処理します。
前行でジャンプしているので21行は処理しません。



~2ループ目~

9行 LD GR1, STR, GR3

【汎用レジスタ】
GR00
GR1110000
GR21000
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



10行 CPA GR1, ='A'

【汎用レジスタ】
GR00
GR1110000
GR21000
GR31

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

CPA命令で、GR1の値 「0」の文字コードと「A」の文字コードを比較します。
(0030)16<(0041)16のためフラグレジスタが変化します。



11行 JMI NUM

【フラグレジスタ】
ZFSFOF
010

SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。



15行 SUBA GR1, ='0'

【汎用レジスタ】
GR00
GR10
GR21000
GR31

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が0になるためフラグレジスタが変化します。



16行 SLL GR1, 0, GR2

【汎用レジスタ】
GR00
GR10
GR21000
GR31

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が0になるためフラグレジスタに変化はありません。



17行 ADDA GR0, GR1

【汎用レジスタ】
GR00
GR10
GR21000
GR31

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR0の値が0になるためフラグレジスタに変化はありません。



18行 SUBA GR2, =4

【汎用レジスタ】
GR00
GR10
GR2100
GR31

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR2の値が4になるためフラグレジスタが変化します。



19行 LAD GR3, 1, GR3

【汎用レジスタ】
GR00
GR10
GR2100
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



20行 JPL LP
21行 JZE LP

【フラグレジスタ】
ZFSFOF
000

ZFが0、SFが0のため、JPL命令で指定されたラベル「LP」に移動し9行を処理します。
前行でジャンプしているので21行は処理しません。



~3ループ目~

9行 LD GR1, STR, GR3

【汎用レジスタ】
GR00
GR1110001
GR2100
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



10行 CPA GR1, ='A'

【汎用レジスタ】
GR00
GR1110001
GR2100
GR310

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

CPA命令で、GR1の値 「1」の文字コード と「A」の文字コードを比較します。
(0031)16<(0041)16のためフラグレジスタが変化します。



11行 JMI NUM

【フラグレジスタ】
ZFSFOF
010

SFが1のため、JMI命令で指定されたラベル「NUM」に移動し15行を処理します。



15行 SUBA GR1, ='0'

【汎用レジスタ】
GR00
GR11
GR2100
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が1になるためフラグレジスタが変化します。



16行 SLL GR1, 0, GR2

【汎用レジスタ】
GR00
GR110000
GR2100
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が16になるためフラグレジスタに変化はありません。



17行 ADDA GR0, GR1

【汎用レジスタ】
GR010000
GR110000
GR2100
GR310

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR0の値が16になるためフラグレジスタに変化はありません。



18行 SUBA GR2, =4

【汎用レジスタ】
GR010000
GR110000
GR20
GR310

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR2の値が0になるためフラグレジスタが変化します。



19行 LAD GR3, 1, GR3

【汎用レジスタ】
GR010000
GR110000
GR20
GR311

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



20行 JPL LP
21行 JZE LP

【フラグレジスタ】
ZFSFOF
100

ZFが1、SFが0のため、JPL命令で指定されたラベル「LP」に移動せず21行を処理します。

ZFが1のため、JZE命令で指定されたラベル「LP」に移動し9行を処理します。



~4ループ目~

9行 LD GR1, STR, GR3

【汎用レジスタ】
GR010000
GR11000001
GR20
GR311

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



10行 CPA GR1, ='A'

【汎用レジスタ】
GR010000
GR11000001
GR20
GR311

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

CPA命令で、GR1の値「A」の文字コードと「A」の文字コードを比較します。
「A」の文字コード=「A」の文字コードのためフラグレジスタに変化はありません。



11行 JMI NUM

【フラグレジスタ】
ZFSFOF
100

ZFが1のため、JMI命令で指定されたラベル「NUM」に移動せず12行を処理します。



12行 SUBA GR1, ='A'

【汎用レジスタ】
GR010000
GR10
GR20
GR311

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が0になるためフラグレジスタに変化はありません。



13行 LAD GR1, 10, GR1

【汎用レジスタ】
GR010000
GR11010
GR20
GR311

【フラグレジスタ】
ZFSFOF
100

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



JUMP NX

JUMP命令でラベル「NX」に移動し16行から処理します。



16行 SLL GR1, 0, GR2

【汎用レジスタ】
GR010000
GR11010
GR20
GR311

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR1の値が10になるためフラグレジスタが変化します。



17行 ADDA GR0, GR1

【汎用レジスタ】
GR011010
GR11010
GR20
GR311

【フラグレジスタ】
ZFSFOF
000

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR0の値が26になるためフラグレジスタに変化はありません。



18行 SUBA GR2, =4

【汎用レジスタ】
GR011010
GR11010
GR21111111111111100
GR311

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001

GR2の値が-4になるためフラグレジスタが変化します。



19行 LAD GR3, 1, GR3

【汎用レジスタ】
GR011010
GR11010
GR21111111111111100
GR3100

【フラグレジスタ】
ZFSFOF
010

【メモリ】
STR+0110000
STR+1110000
STR+2110001
STR+31000001



20行 JPL LP
21行 JZE LP

【フラグレジスタ】
ZFSFOF
010

ZFが0、SFが1のため、JPL命令で指定されたラベル「LP」に移動せず21行を処理します。

ZFが0のため、JZE命令で指定されたラベル「LP」移動せず22行を処理します。

22行 RET

RET命令で、「HEX2INT」サブルーチンを抜けて、呼び出し元の「MAIN」サブルーチンに戻り処理が終了します。



以上で処理が終了し、GR0に答えが格納されています。


GR0:11010 = (001A)16


正しい答えが格納されていますね。





最後に



今回は16進数のキャストについてでした。


キャストするだけで、こんな処理が行われているんですね。


まったく、高級言語は開発コストを大幅に削減できる素晴らしい発明ですねえ。


続きはまた次回にご期待を!









プロフィール

ニッシー
1990年生まれ
血液型 O型

こんにちは。ITブログアルケーナム管理人のニッシーです。

詳細プロフィールへ

お問い合わせへ