【开坑】在mc里搞个操作系统!!!!!
今天在考虑之后,将寄存器数目调整为8个,并且将所有设备io用途的(内存io除外)寄存器全部归并到io接口上。现在寄存器只剩下了ip,acc,zero还有剩下的普通寄存器。
所以另一个重点就是降低io访问的延迟。另外table这个外设用来分析序列,肯定得提供数据本身,也许有几种办法:dma,一个一个提交,提交ptr还有长度然后table自己搜索内存弄到buf里。dma还是太麻烦了。先排除这个
现在的指令集架构
—————————————————
ISAS
位宽:16bits
指令结构:
A:[ op8 ][ a4 ][ b4 ]
M:[ op8 ][ imm8 ]
%a,b是寄存器对象
%imm8是8bit立即数
%在指令执行写回阶段之前,就要求完成$ip<-$ip+1,以保证跳转指令对$ip的覆写值不会被自增偏移
运行环境
—————————————————
主要存储体
mem //支持[0b]~[1111 1111 1111 1111b]物理地址范围
io //支持[0b]~[1111 1111b]物理地址范围
寄存器组
$7~$0 //提供$7~$0八个寄存器
$flag
堆栈组
stk //栈,深度20
stk.spr //备用栈,深度20
—————————————————
寄存器组
—————————————————
$flag //不可操作
$ip //$7,程序计数器
$e~$a //$6~$2,常规的寄存器
$acc //$1,累加器,很多指令会操作它
$zero //$0,永远为0,即使被写入
—————————————————
标志位含义
—————————————————
标志位:CMF(2)
cmf = s.== 11 //在cmp运算中,a=b
cmf = s.>= 10 //在cmp运算中,a>b
cmf = s.<= 01 //在cmp运算中,a<b
cmf = s.u = 00 //未定义状态
—————————————————
寄存器操作指令(A,M)*17
—————————————————
adda,b//add的op为0000 0000,这意味着0000 0000 0000 0000含义是$0<-$0+$0,等价于nop
suba,b//$a<-$a-$b
anda,b
ora,b
nora,b
xora,b
mova,b//$a<-$b
cmpa,b//进行无符号比较,设置cmf
inca,-
deca,-
sla,b
sra,b
sjmp.+imm8
sjmp.-imm8
sjmp.+.=imm8//cmf==s.=
sjmp.+.>imm8//cmf==s.>
sjmp.+.<imm8//cmf==s.<
—————————————————
访存指令(A结构)*5
—————————————————
loada,mm[b]//$a<-mm[$b]
storea,mm[b]//mm[$b]<-$a
inio[imm8]//$acc<-io[imm8]
outio[imm8]//io[imm8]<-$acc
textio[imm8]//io[imm8]?cmf<-s.=:cmf<-s.<
—————————————————
访栈指令(A)*4
—————————————————
popa //pop($a)
pusha //push($a)
pop.sprb//spr.pop($a)
push.sprb//spr.push($a)
—————————————————
立即数指令(M)*2
—————————————————
imm.himm8//$acc_h<-imm8
imm.limm8//$acc_l<-imm8
—————————————————
控制指令*1(M)
—————————————————
stop-//关机
—————————————————
—————————————————
ISAS
位宽:16bits
指令结构:
A:[ op8 ][ a4 ][ b4 ]
M:[ op8 ][ imm8 ]
%a,b是寄存器对象
%imm8是8bit立即数
%在指令执行写回阶段之前,就要求完成$ip<-$ip+1,以保证跳转指令对$ip的覆写值不会被自增偏移
运行环境
—————————————————
主要存储体
mem //支持[0b]~[1111 1111 1111 1111b]物理地址范围
io //支持[0b]~[1111 1111b]物理地址范围
寄存器组
$7~$0 //提供$7~$0八个寄存器
$flag
堆栈组
stk //栈,深度20
stk.spr //备用栈,深度20
—————————————————
寄存器组
—————————————————
$flag //不可操作
$ip //$7,程序计数器
$e~$a //$6~$2,常规的寄存器
$acc //$1,累加器,很多指令会操作它
$zero //$0,永远为0,即使被写入
—————————————————
标志位含义
—————————————————
标志位:CMF(2)
cmf = s.== 11 //在cmp运算中,a=b
cmf = s.>= 10 //在cmp运算中,a>b
cmf = s.<= 01 //在cmp运算中,a<b
cmf = s.u = 00 //未定义状态
—————————————————
寄存器操作指令(A,M)*17
—————————————————
adda,b//add的op为0000 0000,这意味着0000 0000 0000 0000含义是$0<-$0+$0,等价于nop
suba,b//$a<-$a-$b
anda,b
ora,b
nora,b
xora,b
mova,b//$a<-$b
cmpa,b//进行无符号比较,设置cmf
inca,-
deca,-
sla,b
sra,b
sjmp.+imm8
sjmp.-imm8
sjmp.+.=imm8//cmf==s.=
sjmp.+.>imm8//cmf==s.>
sjmp.+.<imm8//cmf==s.<
—————————————————
访存指令(A结构)*5
—————————————————
loada,mm[b]//$a<-mm[$b]
storea,mm[b]//mm[$b]<-$a
inio[imm8]//$acc<-io[imm8]
outio[imm8]//io[imm8]<-$acc
textio[imm8]//io[imm8]?cmf<-s.=:cmf<-s.<
—————————————————
访栈指令(A)*4
—————————————————
popa //pop($a)
pusha //push($a)
pop.sprb//spr.pop($a)
push.sprb//spr.push($a)
—————————————————
立即数指令(M)*2
—————————————————
imm.himm8//$acc_h<-imm8
imm.limm8//$acc_l<-imm8
—————————————————
控制指令*1(M)
—————————————————
stop-//关机
—————————————————