2.82
A:我們要求出那個無窮循環的串的數學公式表示。令其為V,則有右移K位,用十進制來列式子有:
V*2^k=V+Y(高等數學知識)
則V=Y/(2^k-1)
B:(a) 1/7 (b) 0.6 (c) 1/9
4.48
取指階段
icode:ifun = M1[PC] = C:0
rA:rB <= M1[PC+1]
valC <= M4[PC+2]
valP <= PC + 6
譯碼階段
valB <= R[rB]
執行階段
valE <= valB + valC
SetCC
訪存階段
寫回階段
R[rB] <= valE
4.50
取指
bool need_regids =
icode in { IRRMOVL, IOPL, IPUSHL, IPOPL,
IIRMOVL, IRMMOVL, IMRMOVL, IADDL
};
bool need_valC =
icode in { IIRMOVL, IRMMOVL, IMRMOVL, IJXX, ICALL, IADDL
譯碼和寫回
int srcA = [
icode in { IRRMOVL, IRMMOVL, IOPL, IPUSHL } : rA;
icode in { IPOPL,IRET } : RESP;
1 : RNONE; # Don’t need register
];
int srcB = [
icode in { IOPL, IRMMOVL, IMRMOVL, IADDL } : rB;
icode in { IPUSHL, IPOPL, ICALL, IRET } : RESP;
icode in { ILEAVE } : REBP;
1 : RNONE; # Don’t need register
];
int dstE = [
icode in { IRRMOVL} && Cnd: rB;
icode in { IIRMOVL, IOPL, IADDL } : rB;
icode in { IPUSHL, IPOPL, ICALL, IRET, ILEAVE } : RESP;
1 : RNONE; # Don’t write any register
];
int dstM = [
icode in { IMRMOVL, IPOPL}:rA;
icode in { ILEAVE }: REBP;
執行
int aluA = [
icode in { IRRMOVL, IOPL } : valA;
icode in { IIRMOVL, IRMMOVL, IMRMOVL, IADDL} : valC;
icode in { ICALL, IPUSHL}:-4;
icode in { IRET, IPOPL, ILEAVE}:4;
# Other instructions don’t need ALU
int aluB = [
icode in { IRMMOVL, IMRMOVL, IOPL, ICALL,IPUSHL, IRET, IPOPL, ILEAVE, IADDL} : valB;
icode in { IRRMOVL, IIRMOVL}:0;
bool set_cc = icode in { IOPL, IADDL };
訪存
int mem_addr = [
icode in { IRMMOVL, IPUSHL, ICALL, IMRMOVL } : valE;
icode in { IPOPL, IRET } : valA;
icode in { ILEAVE } : valB;
# Other instructions don’t need address
];
bool mem_read = icode in { IMRMOVL, IPOPL, IRET, ILEAVE};