Z:\mito\Clang\AnsiC\asmsp>asmsp opr.asm opr.asm を読み込む 0 LDI 5 1 MLM a 2 ADM b 3 STR b 4 HLT 5 a DC 7 6 b DC 3 ---------- 実行する pc= 0: 命令 LDI 5 : W= 5 番地/値 (値 0) フラグ 次PC= 1: pc= 1: 命令 MLM a : W= 35 番地/値 a (値 7) フラグ 次PC= 2: pc= 2: 命令 ADM b : W= 38 番地/値 b (値 3) フラグ 次PC= 3: pc= 3: 命令 STR b : W= 38 番地/値 b (値 38) フラグ 次PC= 4:この実行経過は、この仮想命令を解釈実行するプログラム(asmsp)で実行した出力です。
int i=10,s =0; do { s = s + i, i--} while ( i != 0)このプログラムのアセンブリプログラムは以下のようになります。0番値のLpは記号番地で、4番地の JNZ lp に対応しています。0,1,2 番地の命令で s = s + i, を実行します。3番地のDEC i で i を一つ減らします。このとき、i が0になると、ZF(zero flag)が1になります。4番地の JNZ lp でZF が1でなければ0番地に戻ります。
0 lp LDM s 1 ADM i 2 STR s 3 DEC i 4 JNZ lp 5 HLT 6 s dc 0 7 i dc 10 ---------- 実行する pc= 0: 命令 LDM s : W= 0 番地/値 s (値 0) フラグ : 次PC= 1: pc= 1: 命令 ADM i : W= 10 番地/値 i (値 10) フラグ : 次PC= 2: pc= 2: 命令 STR s : W= 10 番地/値 s (値 10) フラグ : 次PC= 3: pc= 3: 命令 DEC i : W= 9 番地/値 i (値 9) フラグ : 次PC= 4: pc= 4: 命令 JNZ lp : W= 9 番地/値 (値 0) フラグ : 次PC= 0: pc= 0: 命令 LDM s : W= 10 番地/値 s (値 10) フラグ : 次PC= 1: pc= 1: 命令 ADM i : W= 19 番地/値 i (値 9) フラグ : 次PC= 2: pc= 2: 命令 STR s : W= 19 番地/値 s (値 19) フラグ : 次PC= 3: pc= 3: 命令 DEC i : W= 8 番地/値 i (値 8) フラグ : 次PC= 4: pc= 4: 命令 JNZ lp : W= 8 番地/値 (値 0) フラグ : 次PC= 0: ... 略 pc= 0: 命令 LDM s : W= 52 番地/値 s (値 52) フラグ : 次PC= 1: pc= 1: 命令 ADM i : W= 54 番地/値 i (値 2) フラグ : 次PC= 2: pc= 2: 命令 STR s : W= 54 番地/値 s (値 54) フラグ : 次PC= 3: pc= 3: 命令 DEC i : W= 1 番地/値 i (値 1) フラグ : 次PC= 4: pc= 4: 命令 JNZ lp : W= 1 番地/値 (値 0) フラグ : 次PC= 0: pc= 0: 命令 LDM s : W= 54 番地/値 s (値 54) フラグ : 次PC= 1: pc= 1: 命令 ADM i : W= 55 番地/値 i (値 1) フラグ : 次PC= 2: pc= 2: 命令 STR s : W= 55 番地/値 s (値 55) フラグ : 次PC= 3: pc= 3: 命令 DEC i : W= 0 番地/値 i (値 0) フラグ Z : 次PC= 4: pc= 4: 命令 JNZ lp : W= 0 番地/値 (値 0) フラグ Z : 次PC= 5:
int a=5,b=7,m; if (a < b) m=a; else m=b;これは、次のようにアセンブリ言語で実行されます。大小関係の比較には引き算を行い、負になるか否かで判断します。0,1 番地で引き算をします。a より b が大きいと、引き算の結果 sf (sign flag)が1になります。JNS が SF が1でないときジャンプします。この場合、ジャンプはしないで 3番地に進み Wレジに b の値をいれ I2 にジャンプします。ジャンプしないと、W に a の値が入ります。6 番地で大きい方の値がmに記憶されます。
0 LDM a 1 SBM b 2 JNS l1 3 LDM b 4 JMP l2 5 l1 LDM a 6 l2 STR m 7 HLT 8 a DC 5 9 b DC 7 10 m DC 0 ---------- 実行する pc= 0: 命令 LDM a : W= 5 番地/値 a (値 5) フラグ : 次PC= 1: pc= 1: 命令 SBM b : W= -2 番地/値 b (値 7) フラグ S: 次PC= 2: pc= 2: 命令 JNS l1 : W= -2 番地/値 (値 0) フラグ S: 次PC= 3: pc= 3: 命令 LDM b : W= 7 番地/値 b (値 7) フラグ S: 次PC= 4: pc= 4: 命令 JMP l2 : W= 7 番地/値 (値 0) フラグ S: 次PC= 6: pc= 6: 命令 STR m : W= 7 番地/値 m (値 7) フラグ S: 次PC= 7:
int a[10]; a[5] = 3 ;では、a から連続するメモリを確保し、a + 5 番地 に 3 を代入することになりますが、a + 5 番地を指定する命令がありません。通常、インデックスレジスタ(X)と呼ばれるレジスタに 5 の番地を記録し、STR するとき、この X レジスタと命令の番地を組み合わせて、配列の番地を指定します。