1. 程式人生 > >Lua原始碼閱讀四——lua虛擬機器指令系統

Lua原始碼閱讀四——lua虛擬機器指令系統

本篇文章,主要探討一下lua中的指令系統(涉及到的檔案 lopcodes.c )。

在lua中,用32位的unsigned int型別來表示一條指令操作碼,32位值包含了6位的操作碼和26位的指令欄位兩部分內容。

  All instructions have an opcode in the first 6 bits.
  Instructions can have the following fields:
 `A' : 8 bits
 `B' : 9 bits
 `C' : 9 bits
 `Bx' : 18 bits (`B' and `C' together)
 `sBx' : signed Bx

enum OpMode {iABC, iABx, iAsBx};  /* basic instruction format */

依據上面的列舉值,指令碼目前有三種形式,即iABC,iABx,iAsBx,結構圖如下:

 

對於指令欄位A,B,C,有以下三種形式的取值來源:

/*
** R(x) - register
** Kst(x) - constant (in constant table)
** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x)
*/
其中,用R來表示暫存器值,Kst表示常量表,RK表示可能是常量表或者暫存器。

lua5.14中總共擁有38條指令操作碼,操作碼名稱如下:

操作碼列舉值,和上面的操作碼名稱一一對應,方便呼叫:

38條操作碼對應的操作模式如下:

 

操作模式計算公式如下:

#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))

用8位值來表示

/*
** masks for instruction properties. The format is:
** bits 0-1: op mode
** bits 2-3: C arg mode
** bits 4-5: B arg mode
** bit 6: instruction set register A
** bit 7: operator is a test
*/ 

依次從低位到高位表示如下含義:

第0,1位表示操作碼模式,取值於 enum OpMode {iABC, iABx, iAsBx};  /* basic instruction format */

第2,3位表示引數C模式,取值於 enum OpArgMask {
  OpArgN,  /* argument is not used */
  OpArgU,  /* argument is used */
  OpArgR,  /* argument is a register or a jump offset */
  OpArgK   /* argument is a constant or register/constant */
};

其中OpArgN表示未用引數,OpArgU表示可用引數,OpArgR表示暫存器引數或者跳轉指令,OpArgK表示常量表或者暫存器引數,

第4,5位表示引數B模式,取值於C取值範圍一致。

第6位表示暫存器引數A是否被設定。

第7位表示是否測試操作。