《表1 VMPP虚拟指令格式》

《表1 VMPP虚拟指令格式》   提示:宽带有限、当前游客访问压缩模式
本系列图表出处文件名:随高清版一同展现
《基于指令虚拟化的安卓本地代码加固方法》


  1. 获取 高清版本忘记账户?点击这里登录
  1. 下载图表忘记账户?点击这里登录

VMPP的8种指令格式示例如表1所示。所有类型指令的第1个字节表示操作码(opcode),即具体的指令。表1中“1*”列为“典型指令”列的操作码对应值,比如R类型中add指令的操作码是0x51。后7个字节根据指令类型有不同的格式。比如R类型的指令含义为Dst=Src1 Opcode Src2,其中第2个字节、第7个字节、第8个字节分别表示目的寄存器(Dst)、源寄存器1(Src1)、源寄存器2(Src2),第3个字节指定了寄存器中操作数的大小,其他未使用到的字节为0。因此表1中数据第1行的指令含义是r1=r2+r3。R类型指令与I类型指令都包含算术类、逻辑类、位移类3种指令,但R类型的操作对象均为寄存器,而I类型指令的操作对象为寄存器和立即数。比如表中I类型中addi指令的操作码为0x30,第5~8个字节是立即数(immediate),该指令意为r1=r2+immediate。其他6类指令中,CMP,W,M类型分别用于比较、访存、内存和函数返回。B类型指令用于内部函数调用,VMPP定义的调用惯例为,使用16个参数寄存器专门用于传递参数,将参数从左到右依次存入1~16号参数寄存器中,之后调用目标函数,并在其执行完后将返回值放入1号参数寄存器,完成函数调用。