• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua源码分析(原创)[持续更新中]

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

关于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))

 

t(7)

a(6)

b(4~5)

c(2~3)

m(0~1)

 

如图,第0~1bitm, 2~3bit c,4~5 bitb位,6bita位,7bitt

t,a,b,c,m四部分,一起组成1 byteopcode。下面依次分析下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   /* 该参数是个常量或寄存器常量, Kconst之意 */

};

结合上面定义以及源码注释,不难分析出如下结论:

 

含义

t

是否是测试操作,测试意味着跳转,跳转和测试指令该位为1

a

是否是寄存器操作

b

B参数OpArgMask类型

c

C参数,OpArgMask类型

m

op mode

 

 

LUA 指令格式分析

任意一条指令由操作码(opcode)和操作数组成。

上一章主要对操作码的格式进行了分析,下面来整体分析下Lua中单条指令的格式。

 

Lua中单条指令为32位,依参数的类型和个数不同,有三种模式:

 

    ------------------------->  

iABC:

B(23~31)

C(14~22)

A(6~13)

opcode(0~5)

 

iABx:

Bx(  14~31 )      

A(6~13)

opcode(0~5)

 

iAsBx:

sBx( 14~31 )      

A(6~13)

opcode(0~5)

 

三种模式中i表示6位的opcode,iABC表示三个参数的指令,iABx将iABC中的B和C合并为18位的无符号数,

iAsBx将iABC中的B和C合并为18位的有符号数。

 

 

相关元素SIZEPOS定义如下:

#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 */

该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua笔记二发布时间:2022-07-22
下一篇:
Lua 5.1 参考手册发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap