本文通過c++程式語言實現了乙個簡易的cpu,具有資料訪問及簡單的alu功能。
#include
#include
#include
using
namespace std;
#define opalu 0
#define oplw 35
#define opsw 43
#define opbeq 4
#define opj 2
#define fnadd 32
#define fnsub 34
#define fnand 36
#define fnor 37
#define fnslt 42
#define msize 256
char m[msize]
;// 儲存器
int32_t
readword
(uint32_t addr)
void
writeword
(uint32_t addr,
int32_t data)
int32_t r[32]
;// 通用暫存器
uint32_t pc;
uint32_t ir;
// 指令暫存器,儲存當前被執行的指令
#define getop(ir) ((ir>>26) & 63)
#define getrs(ir) ((ir>>21) & 31)
#define getrt(ir) ((ir>>16) & 31)
#define getrd(ir) ((ir>>11) & 31)
#define getsm(ir) ((ir>>6) & 31)
#define getfn(ir) (ir & 63)
#define getim(ir) (ir & 0xffff)
#define getad(ir) (ir & 0x3ffffff)
void
fetch()
void
init()
;for
(int i=
0; i<
32; i++
)for
(int i=
0; i4; i++
)writeword(0
,(oplw<<26)
|(1<<16)
|(msize-4)
);// lw $1, $0(252)
writeword(4
,(oplw<<26)
|(2<<16)
|(msize-8)
);// lw $2, $0(248)
writeword(8
,(opbeq<<26)
|(1<<21)
|(2<<16)
|7);
// beq $1, $2, 7
writeword(12
,(opalu<<26)
|(2<<21)
|(1<<16)
|(2<<11)
| fnsub)
;// sub $2, $2, $1
writeword(16
,(opalu<<26)
|(2<<21)
|(2<<16)
|(3<<11)
| fnadd)
;// add $3, $2, $2
writeword(20
,(opalu<<26)
|(3<<21)
|(2<<16)
|(4<<11)
| fnand)
;// and $4, $3, $2
writeword(24
,(opalu<<26)
|(4<<21)
|(2<<16)
|(5<<11)
| fnor)
;// or $5, $4, $2
writeword(28
,(opalu<<26)
|(5<<21)
|(2<<16)
|(6<<11)
| fnslt)
;// slt $6, $5, $2
writeword(32
,(opsw<<26)
|(6<<16)
|60);
// sw $6, $0(60)
writeword(36
,(opj<<26)
|2);
// j 2
writeword(40
,(opj<<26)
);// j 0
pc =0;
ir=readword
(pc);}
void
showall()
printf
("\n\n");
for(
int i=
0; i<
32; i++
)printf
("\n\npc=%d ir=%08x\n"
, pc, ir);}
intmain()
printf
("\npress a key to continue ...");
getchar()
;getchar()
;//printf("\npc=%d ir=%08x\n", pc, ir);
op =
getop
(ir)
; rd =
getrd
(ir)
; rt =
getrt
(ir)
; rs =
getrs
(ir)
; sm =
getsm
(ir)
; im =
getim
(ir)
; ad =
getad
(ir)
; fn =
getfn
(ir)
;switch
(op)
break
;case oplw:
printf
("\nexecuting: lw $%d, $%d(%d)\n"
, rt, rs, im)
; r[rt]
=readword
(rs+im)
;break
;case opsw:
printf
("\nexecuting: sw $%d, $%d(%d)\n"
, rt, rs, im)
;writeword
(rt,r[rs+im]);
break
;case opbeq:
printf
("\nexecuting: beq $%d, $%d, %d\n"
, rs, rt, im);if
(r[rs]
==r[rt]
) pc=pc+
4*im;
break
;case opj:
printf
("\nexecuting: j %d\n"
, ad)
; pc=pc+
4*ad-4;
break
;default
:printf
("\n!!! unknown opcode: %d !!!\n"
, op);}
fetch()
;showall()
;}return0;
}
C 動態陣列的C 簡易實現
定義一元素為整數的動態陣列類,並在主函式中呼叫各個功能 資料成員 指向元素首位址的指標 用於儲存動態申請的陣列空間 當前陣列的容量 當前元素的個數 成員函式 帶參 無參建構函式 無參的動態申請10個元素空間並改變當前陣列的容量 當前元素的個數值 帶參的按引數處理 在尾部增加一元素 修改指定位置上的元...
C 簡易複數類的實現
兩個反思點 在使用流運算子時需要使用友元函式。在實戰中,運算子的過載若為成員函式其引數必須少於2兩個,即最多乙個引數。所以流運算子需要有兩個引數,但是它又必須呼叫類裡的私有成員,所以就使用了友元函式的方法。其餘都是比較easy的。include using namespace std class c...
C 實現簡易的計算器
1 form1窗體設計介面如下 2 運算型別的下列列表中包括 加法 減法 乘法 除法 取模共5種操作 初始狀態下,選擇 加法 運算,當使用者更改運算型別時,下面式子中的加號 應自動更改為相應的運算子 3 當使用者在前兩個文字框中輸入時,最後得到結果的文字框始終是空白狀態,注意該文字框是唯讀的,使用者...