/********************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//取绝对值

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐