割り算

今度は割り算を試す。前回と同じく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;
}

f:id:ti-nspire:20201121112833p:plain