添加一些cpu操作

This commit is contained in:
ranchuan
2024-12-04 11:39:53 +08:00
parent 7c97a9595e
commit 5e072f0380
3 changed files with 193 additions and 35 deletions

51
cpu.py
View File

@@ -20,6 +20,10 @@ class cpu(object):
self.rom=bytearray(rom_size)
self.mem_addr=mem_addr
self.mem=bytearray(mem_size)
self.pc=self.mem_addr
self.sp=self.mem_addr
self.rp=self.pc
self.fp=self.sp
def get_value(self,addr:int,size:int):
if not (size in [1,2,4,8]):
raise Exception(f"CPU 异常 因为地址未对齐 {size}")
@@ -30,7 +34,50 @@ class cpu(object):
raise Exception(f"CPU 异常 因为地址未对齐 {size}")
if(addr>=self.rom_addr) and (addr<self.rom_addr+len(self.rom)):
set_value(self.rom[addr-self.rom_addr,addr-self.rom_addr+size],value)
def opt_add(self,src_addr1:int,src_addr2:int,out_addr:int):
src1=self.get_value(src_addr1,4)
src2=self.get_value(src_addr2,4)
self.set_value(out_addr,4,src1+src2)
def opt_sub(self,src_addr1:int,src_addr2:int,out_addr:int):
src1=self.get_value(src_addr1,4)
src2=self.get_value(src_addr2,4)
self.set_value(out_addr,4,src1-src2)
def opt_bitor(self,src_addr1:int,src_addr2:int,out_addr:int):
src1=self.get_value(src_addr1,4)
src2=self.get_value(src_addr2,4)
self.set_value(out_addr,4,src1|src2)
def opt_bitand(self,src_addr1:int,src_addr2:int,out_addr:int):
src1=self.get_value(src_addr1,4)
src2=self.get_value(src_addr2,4)
self.set_value(out_addr,4,src1&src2)
def opt_bitxor(self,src_addr1:int,src_addr2:int,out_addr:int):
src1=self.get_value(src_addr1,4)
src2=self.get_value(src_addr2,4)
self.set_value(out_addr,4,src1^src2)
def opt_jmp(self,jmp_addr:int):
self.pc=jmp_addr
# 要进入子函数 先enter 再设置形式参数
def opt_enter(self,enter_addr:int):
self.set_value(self.sp,4,self.rp)
self.rp=self.pc
self.sp+=4
self.set_value(self.sp,4,self.fp)
self.sp+=4
self.fp=self.sp
self.pc=enter_addr
# 返回的时候先回溯sp指针 然后把pc指针指定到之前的pc指针+4的位置
def opt_return(self,return_value:int):
self.sp=self.fp
self.sp-=4
self.fp=self.get_value(self.sp,4)
self.pc=self.rp+4
self.sp-=4
self.rp=self.get_value(self.sp,4)
self.set_value(self.sp,4,return_value)
# 在栈上创建变量的存储空间
def create_var(self,size:int):
ret=self.sp
self.sp+=((size+3)//4)*4
return ret