今度は割り算を試す。前回と同じくOUTポートをINポートに直結しておく。A、Bレジスタの状態についても動作確認用基板のLEDで見られるようにしておくべきであった。
// テキストのプログラム例(4) // 9/2=4(0100)余り1を計算する。 // 0111(9-2=7)、0101(9-2-2=5)、0011(9-2-2-2=3)、0001(9-2-2-2-2=1)の順に表示されたあと、 // 0100(9/2=4)と表示される。 _[0] = LD_A(9); // 割られる数 _[1] = LD_B(0); // 何回引き算ができたかの初期値 _[2] = SUB_A(2); // 割る数(引く数) _[3] = JNC(10); // 引いた結果が負なら、ループを抜けて10番地へ _[4] = OUT_A; // 今の引き算結果(すなわち余り)を出力して、 _[5] = LD_AB; // 引き算できた回数をこの3行でインクリメントして、 _[6] = ADD_A(1); _[7] = LD_BA; _[8] = IN_A; // 今の引き算結果(すなわち余り)(今OUTレジスタにある)を読み込んで、 _[9] = JUMP(2); // 引き算を繰り返す。 _[10] = IN_A; // (引いた結果が負なら3番地から)余り(今OUTレジスタにある)をAに格納し、 _[11] = OUT_B; // 商(何回引き算ができたか)を出力する。 _[12] = HALT; _[13]; _[14]; _[15];
↓これと同じ。
#include <iostream> using namespace std; int main(void){ int A = 9; int B = 0; int OUT; while(true){ A -= 2; if(A<0) break; OUT = A; printf("%d, ", OUT); A = B; A++; B = A; A = OUT; } A = OUT; printf("\n余り: %d\n", A); printf("商: %d\n", B); return 0; }