簡易CPU的C 實現

2021-10-08 08:58:18 字數 3806 閱讀 5177

本文通過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 當使用者在前兩個文字框中輸入時,最後得到結果的文字框始終是空白狀態,注意該文字框是唯讀的,使用者...