虚拟机技术:lvm指令集系统
/********************lvm指令集系统*****************************/ /**lvm--->lauo virtual machine *** **!本文件主要包括lvm的指令集系统,内含丰富的自定义指令规范 **!指令集架构融合了RISC指令的规整性,以及CISC指令的强大计算能力, **!甚至加入了高度可扩充的"协处理器指令&quo
/********************lvm指令集系统*****************************/
/**lvm--->lauo virtual machine
***
**!本文件主要包括lvm的指令集系统,内含丰富的自定义指令规范
**!指令集架构融合了RISC指令的规整性,以及CISC指令的强大计算能力,
**!甚至加入了高度可扩充的"协处理器指令",以全面提升虚拟机执行速度。
***
***作者: BUG_lauo
***编制日期:2009-06-20
***************************************************************/
Regs:
double dReg[256];//8字节双浮点--dr0-dr255(便于一个字节能搞掂其编码)
float fReg[256];//4字节单浮点--fr0-fr255(便于一个字节能搞掂其编码)
long lReg[256];//4字节整数----lr0-lr255(同上)
long pc;//程序指针
long sp;//堆栈指针(可指向两种多种类型的栈)
long sr;//状态寄存器 ----考虑要不要取消它,用高级语言取代它 ---如if a then b 可以这么做 cmp a(不取消为好。。。。)
long cs;//代码段
long ds;//数据段
long ss;//堆栈段
操作包括:
运算型:
adf(add,adl) rd,rn1,rn2 例如:adf r0,r1,r2-->fr0=fr1+fr2
sbf(sbd,sbl) rd,rn1,rn2 例如:sbf r0,r1,r2-->fr0=fr1-fr2
dvf(dvd,dvl) rd,rn1,rn2 例如:dvf r0,r1,r2-->fr0=fr1/fr2
mlf(mld,mll) rd,rn1,rn2 例如:mll r0,r1,r2-->lr0=lr1*lr2 (由操作码指明运算在哪一类寄存器上)
mod rd,rn1,rn2 例如:mod r0,r1,r2-->lr0=lr1%lr2 (取模运算)
inc rn 例如:inc r0-->lr0=lr0+1;
dec rn 例如:dec r1-->lr1=lr1-1;
shr rd,rn1,nr2 例如:shr r0,r1,r2-->lr0=lrn1>>lr2 //逻辑右移
shl rd,rn1,rn2 例如:shl r0,r1,r2-->lr0=lrn1<<lr2 //逻辑左移
orl rd,rn1,rn2 例如:orl r0,r1,r2-->lr0=lrn1|lrn2 //逻辑或
anl rd,rn1,rn2 例如:anl r0,r1,r2-->lr0=lrn1&lrn2 //逻辑与
xor rd,rn1,rn2 例如:xor r0,r1,r2-->lr0=lrn1^lrn2 //按位异或
not rd,rn 例如:not r0,r1 -->lr0=~lr1 //按位取反
注:以上指令在运算时,并不改变sr状态
数据传送、转换、交换指令:
mvf(mvd,mvl) rd,rn 例如:mvf r0,r1-->fr0=fr1
tfd(tfl,tlf,tld,tdl,tdf) rd,rn 例如:tfl r0,r0-->fr0=lr0(用于数据转换)
swpf(swpd,swpl) rd,rn 例如:swpf r0,r1-->fr255=fr1,fr1=fr0,fr0=fr255
数据加载、存储指令:
ldf(ldl,ldd) rd,[rn] 例如:ldf r0,[r1]-->fr0=(*lr1)
ldf(ldl,ldd) rd,#imm 例如:ldf r0,#1.233-->fr0=1.233;ldl r0,#100-->lr0=100
ldf(ldl,ldd) rd,[#imm] ;类于其上
ldf(ldl,ldd) rd,[rn,#imm]
stf(stl,std) rd,[rn] 例如:stf r0,[r1]-->(*lr1)=fr0;
stf(stl,std) rd,[#imm]
stf(stl,std) rd,[rn,#imm]
pushd(pushd,pushl) rn 例如:pushf r0-->(*sp)=fr0,sp+=sizeof(float)
popf(popd,popl) rn 例如:popf r0-->fr0=(*sp),sp-=sizeof(float)
pushfa(pushda,pushla) 例如:pushfa --->(*sp)=fr0,sp+=4,(*sp)=fr1....
popfa(popda,popla) 例如:popfa --->memcpy(fReg,sp,sizeof(fReg))//c++实现之
跳转、分支指令:
jmp label (label汇编时占四个字节,与cs长度一致,下同)
jz label
jnz label
js label
jns label
jc label
jnc label
jeq label
jne label
jlt label
jgt label
jge label
jle label
增强型跳转指令:
jzf(jzl,jzd) rn,label 例如:jzf r0,label-->if fr0=0 then jmp label
jnzf(jnzl,jnzd) rn,label 类于其上
jsf(jsl,jsd) rn,label 例如:jsf r0,label-->if fr0<0 then jmp label
jnsf(jnsl,jnsd) rn,label 类于其上,只不过为:if r0>=0 then jmp label
jcf(jcl,jcd) rn1,rn2,label 例如:jcl r1,r2,label-->if lr1-lr2<0 then jmp label
jncf(jncl,jncd) rn1,rn2,label 例如:jncl r1,rn2,label-->if lr1-lr2>=0 then jmp label
jeqf(jeql,jeqd) rn1,rn2,label 例如:jeqf r0,r1,label-->if fr0-fr1=0 then jmp label
jnef(jnel,jned) rn1,rn2,label 类于其上
jltf(jltl,jltd) rn1,rn2,label 例如:jltf r0,r1,label -->if fr0<fr1 then jmp label
jgtf(jgtl,jgtd) rn1,rn2,label 类于其上
jgef(jgel,jged) rn1,rn2,label 例如:jgel r0,r1,label-->if lr0>=lr1 then jmp label
jlef(jlel,jled) rn1,rn2,label 类于其上
djnz rn,label 例如:djnz r0,label if lr0--,lr0!=0 then jmp label //只设置了整数的
比较、测试指令:
cmpf(cmpd,cmpl) rn1,rn2 例如:cmpf r1,r2--->r1-r2进而改变sr的值
test rn1,rn2 例如:test r1,r2--->lr1&lr2进而改变sr的值
协处理器指令:
idll rd,rn 例如:idll r0,r1;//将lr1指向的动态库名加载到lr0中,如果失败则lr0=0 (动态库加载指令)
outi rn0,rn1,rn2,rn3 例如:outi r0,r1,r2,r3->lr0指向动态库的句柄,lr1指向调用的函数名,lr2指向传入参数列表,lr3指向返回参数列表 (外部指令)
fdll rn 例如:fdll r0//将动态库句柄为lr0的动态库释放成功时,lr0=0,否则为原值 (动态库释放指令)
CISC指令调用:
字符串:
newstr rd 例如:newstr r0-->lr0=new string//新建一个字符串类(new string)
delstr rn 例如:delstr r0-->delete lRegs[lr0]//将对应的字符串类空间释放掉(有安全保护模式的---一个str* list,以保证删除的是自已申请的字符串对象)
getl rd,rn 例如:getl r0,r1-->lr0=(*lr1).length();//得到字串的长度
getch rd,rs,rn1 例如:getch r0,r1,r2-->lr0=(*lr1)[lr2] //r1为string指针,r2为索引
setch rs,rn1,rc 例如:setch r0,r1,r2-->(*lr0)[lr1]=char(lr2)//设置对应位的值
strcat rd,rs 例如:strcat r0,r1 //将lr1指向的字串添加到lr0的字串的尾部
addc rd,rc 例如:addc r0,r1-->(*lr0)+=char(lr1)//lr0指身的字符串加上一字符lr1
strcmp rd,rn1,rn2例如:strcmp r0,r1,r2 //比较lr1,lr2两个字符串,得到结果存于rd中
puts rn 例如:puts r0-->cout<<*lr0;//相当于将lr0指向的字串输出到屏幕
gets rn 例如:gets r0-->cin>>*lr0;//相当于将输入字符串赋值给lr0指向的字串
putch rn 例如:putch r0-->cout<<char(lr0);//将lr0以字符形式输出
getch rn 例如:getch r0-->cin>>char(lr0);//输入一个字符,并且存于lr0中
输出函数还有:
coutf(coutl,coutd) rn 例如:coutf r0-->cout<<fr0;//将一单精度输出到屏幕
cinf(cinl,cind) rn 例如:cinf r0-->cin>>fr0;//输入一单精度浮点数到fr0中
三角函数:
sinf(sind) rd,rn 例如:sinf r0,r1-->fr0=sin(fr1) //正弦
cosf(cosd) rd,rn 例如:cosd r0,r1-->dr0=cos(dr1) //余弦
asinf(asind) rd,rn //反正弦
acosf(acosd) rd,rn //反余弦
tanf(tand) rd,rn //正切
ctanf(ctand) rd,rn //余切
atnf(atnd) rd,rn //反正切
actnf(actnd) rd,rn //反余切
其它数学函数:
powf(powd) rd,rn1,rn2 例如:powf r0,r1,r2-->fr0=fr1^fr2 //求得指数
sqrtf(sqrtd) rd,rn //求得根值
expf(expd) rd,rn //自然指数
lnf(lnd) rd,rn //自然对数
absf(absd,absl) rd,rn//取绝对值
更多推荐
所有评论(0)