在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
关于Lua源码的基础型别、内存分配、字符串存储、垃圾回收机制、table原理等部分讲解,我发现有位仁兄写得相当之好,强烈推荐大家先认真阅读下面这篇文章,链接如下: http://simohayha.iteye.com/blog/517748
本文将只对Lua的字节码和虚拟机的运行相关内容做重点分析
LUA OPCODE格式分析: Lopcodes.c Lua Opcode的格式关键在下面这个宏: #define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))
如图,第0~1bit为m位, 2~3bit 为c位,4~5 bit为b位,6bit为a位,7bit为t位 t,a,b,c,m四部分,一起组成1 byte的opcode。下面依次分析下t,a,b,c,m各自扮演什么角色。 lua所有指令编码都在下面这个结构中 : const lu_byte luaP_opmodes[NUM_OPCODES] = { /* T A B C mode opcode */ opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */ ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */ ......(此处略去78行,有需要请参考附录A LUA OPCODE一览) ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */ }; enum OpArgMask { OpArgN, /* 参数未被使用 */ OpArgU, /* 已使用参数 */ OpArgR, /* 该参数是寄存器或跳转偏移 */ OpArgK /* 该参数是个常量或寄存器常量, K乃const之意 */ }; 结合上面定义以及源码注释,不难分析出如下结论:
LUA 指令格式分析: 任意一条指令由操作码(opcode)和操作数组成。 上一章主要对操作码的格式进行了分析,下面来整体分析下Lua中单条指令的格式。 Lua中单条指令为32位,依参数的类型和个数不同,有三种模式:
高 -------------------------> 低 iABC:
iABx:
iAsBx:
三种模式中i表示6位的opcode,iABC表示三个参数的指令,iABx将iABC中的B和C合并为18位的无符号数, iAsBx将iABC中的B和C合并为18位的有符号数。 相关元素SIZE和POS定义如下: #define SIZE_C 9 #define SIZE_B 9 #define SIZE_Bx (SIZE_C + SIZE_B) #define SIZE_A 8 #define SIZE_OP 6 #define POS_OP 0 #define POS_A (POS_OP + SIZE_OP) #define POS_C (POS_A + SIZE_A) #define POS_B (POS_C + SIZE_C) #define POS_Bx POS_C 附录A LUA OPCODE一览: const lu_byte luaP_opmodes[NUM_OPCODES] = { /* T A B C mode opcode */ opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */ ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LOADNIL */ ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */ ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_GETGLOBAL */ ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETTABLE */ ,opmode(0, 0, OpArgK, OpArgN, iABx) /* OP_SETGLOBAL */ ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_SETUPVAL */ ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABLE */ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_NEWTABLE */ ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_SELF */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_ADD */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SUB */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MUL */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MOD */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_POW */ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */
全部评论
|
请发表评论