官术网_书友最值得收藏!

1.2.2 虛擬機(jī)指令的編碼方式

前面介紹了虛擬機(jī)核心的數(shù)據(jù)結(jié)構(gòu)和基本的運行方式,使讀者對Lua虛擬機(jī)有了大概的認(rèn)識。Lua虛擬機(jī)運行的本質(zhì),就是不斷獲取并運行Lua的虛擬機(jī)指令。在Lua中,虛擬機(jī)有自己能夠識別的指令集,在這個集合里有不同的指令,會執(zhí)行不同的功能。Lua腳本經(jīng)過編譯后,會生成包含在指令集里的指令,以確保虛擬機(jī)能夠識別。在探討Lua虛擬機(jī)指令集之前,先來了解一下Lua虛擬機(jī)指令的幾種編碼方式。

Lua虛擬機(jī)指令的編碼方式(也是本書實現(xiàn)Lua解釋器采用的編碼方式)主要有3種,它們分別是iABC、iABx和iAsBx。虛擬機(jī)指令信息是保存在32bit無符號整型變量中,指令信息、參數(shù)信息會被編入這樣的整型變量中。每個指令一共有32bit(位),并且所有的指令長度都是一樣的。3種模式所表示的編碼方式是不一樣的。

iABC模式的編碼方式如圖1-16所示。從圖中可以看到,該模式的指令主要由4個部分組成,分別是opcode域、A域、B域和C域。

·圖1-16

opcode就是操作碼,本質(zhì)上指代的是虛擬機(jī)指令集里的指令(每個指令都有自己的數(shù)值編碼),也就是說,只要識別它就能夠知道當(dāng)前用的是哪個指令了。opcode占6bit,因此它能夠表示的最大值是26,也就是64,指令集的指令上限是64個。本書實現(xiàn)的Lua虛擬機(jī),并沒有包含官方所有的指令,隨書工程實現(xiàn)的指令一共是43個。

緊臨opcode域的是A域,它表示的是被操作的目標(biāo),本質(zhì)就是代表寄存器的位置。前文也提到過,Lua虛擬機(jī)的寄存器實際上用的是棧上的空間,因此A域的值指代的就是棧上的某個位置,在這個指令里被當(dāng)作寄存器使用了。A域占8bit,它能表示的最大值是256(所表示的值落在0~255這個區(qū)間),實際上限制了棧的有效空間(因為超過255,虛擬機(jī)指令就找不到這個位置了)。

接著是B域和C域,這兩個域主要是存放參數(shù)信息。它們各占9bit,能表示的最大范圍是29,也就是512。B域和C域具體代表什么信息,實際上是由opcode決定的。比如,操作對象如果是字符串,字符串本身的內(nèi)容是沒法編入這么短的域中的;因此,需要將不同的信息存放到不同的位置,再將它們的索引信息找出編入指令中。Lua的絕大多數(shù)指令,采用的是iABC模式。

iABx模式的編碼方式如圖1-17所示。和iABC模式不一樣的是,iABx模式?jīng)]有B和C域,而只有一個Bx域,這個域占18bit。使用這種模式的指令很少,只有OP_LOADK、OP_LOADKX和OP_CLOSURE三個指令。Bx所代表的值是無符號的。

·圖1-17

iAsBx模式的編碼方式如圖1-18所示。iAsBx的模式和iABx大體相當(dāng),只是高18bit的值是有符號的,可以表示負(fù)數(shù)。但是sBx域并沒有采取二進(jìn)制補(bǔ)碼的方式,而是采用一個bias值作為0值分界。因為sBx域占18bit,因此它能表示的最大無符號整數(shù)值是262143(218-1)。那么它的零值則是131071(262143>>1)。當(dāng)需要它表示-1時,那么sBx域的值為131070(131071-1)。采用iAsBx模式的指令一般和跳轉(zhuǎn)有關(guān)系,比如OP_JMP、OP_FORLOOP、OP_FORPREP和OP_TFORLOOP指令等。

·圖1-18

主站蜘蛛池模板: 新巴尔虎右旗| 宁强县| 安义县| 五寨县| 黔西| 临海市| 饶河县| 濉溪县| 鹤岗市| 巧家县| 湖北省| 沁阳市| 买车| 达孜县| 白玉县| 南澳县| 大宁县| 丹江口市| 镇平县| 蒙自县| 临沂市| 甘德县| 武宁县| 太康县| 天全县| 肥乡县| 长垣县| 大邑县| 秀山| 沁源县| 绥化市| 长岛县| 怀集县| 嘉鱼县| 孝义市| 五台县| 青阳县| 屏南县| 临邑县| 孟州市| 吴川市|