lua2 1的指令筆記

2021-05-22 05:23:39 字數 3456 閱讀 1514

為了方便講述,這裡規定了一些名稱:

t-1表示棧頂物件

t-2表示棧頂元素的下乙個物件

t-3表示t-2的下乙個物件

push系列:

【pushnil】將乙個nil物件放置到棧頂。

【push0】將數字0放置到棧頂

【push1】將數字1放置到棧頂

【push2】將資料2放置到棧頂

【pushbyte b】將位元組b放置到棧頂(這個版本中byte為:unsigned char)

【pushword w】將乙個字w放置到棧頂(這個版本中word為:unsigned short)

【pushfloat f】將乙個浮點數f放置到棧頂(這個版本中float為:float)

【pushstring w】將乙個索引為w的字串放置到棧頂(索引w是指lua內部的乙個全域性的符號表中的索引)

【pushfunction f】將乙個函式翻譯過後的位元組碼串的位址放到棧頂

【pushglobal w】將全域性變數放置到棧頂(w表示這個全域性變數在全域性變數表中的索引)

【pushindexed】t-2是關聯陣列,令h = t-2[t-1]並將t-2和t-1彈出然後將h壓入棧中

【pushself】(暫無解釋)

【pushlocal0】 將第乙個區域性變數放置到棧頂。

【pushlocal1】 將第二個區域性變數放置到棧頂。

【pushlocal9】 將第十個區域性變數放置到棧頂

【pushlocal num】 將第(num+1)個區域性放置到棧頂

*說明:「pushlocal」系列性指令的用途在於將區域性變數放置到棧頂,需要注意的是,這些區域性變數都是在棧中,第n個區域性變數比第n+1個變數的更靠近棧底。

store系列:

【storeglobal w】將t-1的值儲存到全域性變數中(w表示這個全域性變數再全域性變數表中的索引)

【storelocal0】將t-1的值儲存到第乙個區域性變數中

【storelocal1】            將t-1的值儲存到第二個區域性變數中

【storelocal9】將t-1的值儲存到第十個區域性變數中

【storelocal num】      將t-1的值儲存到第(num+1)個區域性變數中

【storerecord n w[n]】 這個指令比較複雜,大概的意思是這樣:在棧上有個陣列a,它距離棧頂有n個物件的距離,

而在a和棧頂之間的n個物件需要作為值設定到a中,而w陣列這是這些值對應的key,需要

注意的是w[0]對應的是t-1,w[1]對應的是t-2,依此類推即可。

【storeindexed0】t-3為關聯陣列,那麼這個指令就是t-3[t-2] = t-1,指令結束之後將t-1、t-2和t-3從棧中彈出

【storeindexed n】t-n-3為關聯陣列,t-n-3[t-n-2] = t-1

【storelist0 n】t-n-1為關聯陣列a,那麼這個操作是這樣:a[n] = t-1,棧頂出棧;a[n + 1] = t-1,棧頂出棧;

直到棧頂為a的時候停止

【storelist m n】t-n-1為關聯陣列a,那麼這個操作是這樣:a[n + m *40] = t-1,棧頂出棧;a[n + 1 + m * 40] = t-1,棧頂出棧;直到棧頂為a的時候停止

*說明:「storelocal」系列是「pushlocal」系列的反過程

【createarray size】在棧頂建立乙個關聯陣列,size指定了關聯陣列的初始容量

【eqop】對比t-1和t-2,對比之後將這兩個物件從棧中彈出並將結果放置到

棧頂(如果相等則是乙個值為1的數字物件,否則是乙個nil物件)

【ltop】判斷t-1是否小於t-2,結果和eqop一致

【leop】判斷t-1是否小於或等於t-2,結果和eqop一致

【gtop】判斷t-1是否大於t-2,結果和eqop一致

【geop】判斷t-1是否大於或等於t-2,結果和eqop一致

【jmp w】向後跳轉w個位元組(在指令位元組串中跳轉)

【upjmp w】向前跳轉w個位元組(在指令位元組串中跳轉)

【iffjm p w】如果棧頂為nil物件,則向後跳轉w個位元組(在指令位元組串中跳轉)

【iffupjump w】如果棧頂為nil物件,則向前跳轉w個位元組(在指令位元組串中跳轉)

【ontjmp w】          如果t-1部是nil物件則在指令位元組串中向後跳轉w個位元組

【onfjmp w】  

如果t-1部不是nil物件則在指令位元組串中向後跳轉w個位元組

【pop】將棧頂的物件彈出

計算系列

【addop】將(t-1 + t-2)的結果放置到棧頂,放置 之前需要將t-1和t-2彈出,這個指令有個需要注意的

地方是當t-1或t-2中至少有乙個不是數字物件時,lua將呼叫其內部的"add"函式來計算

【subop】將(t-1 - t-2)的結果放置到棧頂,放置之前需要將t-1和t-2彈出,這個指令有個需要注意的

地方是當t-1或t-2中至少有乙個不是數字物件時,lua將呼叫其內部的"sub"函式來計算

【multop】將(t-1 * t-2)的結果放置到棧頂,放置之前需要將t-1和t-2彈出,這個指令有個需要注意的

地方是當t-1或t-2中至少有乙個不是數字物件時,lua將呼叫其內部的"mul"函式來計算

【divop】將(t-1 / t-2)的結果放置到棧頂,放置之前需要將t-1和t-2彈出,這個指令有個需要注意的

地方是當t-1或t-2中至少有乙個不是數字物件時,lua將呼叫其內部的"div"函式來執行計算

【powop】(t-1^t-2)並將結果放置到棧頂,放置之前需要將t-1和t-2彈出,lua呼叫內部函式"div"執行

計算【concop】連線字串物件t-1和t-2並將結果放置到棧頂,放置之前需要將t-1和t-2彈出,如果兩者中

至少有乙個不是字串物件的時候,lua將呼叫內部函式來執行操作

【minusop】為數字物件t-1取負,如果t-1不是數字物件,lua將呼叫內部函式unm來執行操作

【notop】如果t-1為空則彈出t-1並在棧頂放置數字物件且值為1,否則放置nil物件

【adjuest0】調整棧頂:這個指令其實已經清空棧

【adjuest w】調整棧頂到距棧底w個物件的地方

【setfunction code fn】向函式棧中壓入乙個函式節點(funcstacknode),並將這個函式作為下乙個將要執行的函式

code表示這個函式的指令位元組碼,w表示這個函式再全域性變數表中的索引

【reset】 將乙個函式從函式棧中彈出,彈出之後的當前棧頂函式將成為當前函式

【callfunc np nr】驅動在t-np-1的位置的函式物件工作,np表示引數數量,nr表示返回值數量。

【retcode0】 每個函式在執行的時候都會以棧的某個偏移量為基準位置作為自己的執行時棧,這裡姑且將這個基準

位置稱為base,retcode0這個指令要求函式執行之後以base為起點放置返回值

【retcode n】 要求函式執行之後以base+n為起點放置返回值

lua2 1 全域性變數和區域性變數(完善中)

變數是lua2.1中的基石,由於各變數的作用的不同,我們一般分為全域性變數和區域性變數,在lua2.1中也有這兩種變數,但是在其內部的 具體實現的卻很難讓人理解,本文主要來 lua2.1中全域性變數和區域性變數的具體實現細節。與以往的分析不同,這次我們先來個例項。b 1 function func1...

openresty開發系列21 lua的模組

openresty開發系列21 lua的模組 從lua5.1開始,lua 加入了標準的模組管理機制,lua 的模組是由變數 函式等已知元素組成的 table,因此建立乙個模組很簡單,就是建立乙個 table,然後把需要匯出的常量 函式放入其中,最後返回這個 table 就行。一 模組定義 模組的檔名...

Lua學習筆記 Lua入門基礎的語法

變數的定義 1.通常由a z或a z組成加下劃線 數字 2.也可以 開頭加小寫字母 3.變數區分大小寫全域性與區域性變數 1.使用local關鍵字定義區域性變數 2.未使用local關鍵字的預設為全域性變數 local a 123 a為區域性變數 b 567 b為全域性變數 注意多使用區域性變數 1...