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位表示是否測試操作。