當前位置:首頁 » 編程軟體 » lua編譯為wasm

lua編譯為wasm

發布時間: 2023-01-01 10:43:21

1. lua 文件編碼

lua自身僅保證輸入輸出流為8bit,對於編碼本身並無任何改變;換言之寫入文本的編碼視寫入內容而定,比如你硬代碼一段文本,而lua文件編碼為ansi,那麼寫入的就是ansi;如果lua源文件編碼為utf-8則寫入為utf-8.
同樣的,如果你是從外部讀取文件,那麼lua自身不會進行轉換;比如從utf-8編碼的文本中讀取字元串寫入文本,那麼寫入部分的文本即為utf-8.
如果你要實現的只是簡單寫入ansi文本(比如logging),那麼在環境允許的情況下將原文件編碼設為ansi即可;或者還能用換碼符直接寫入(這個不太方便了就是)
當然也可以通過使用外部庫在lua中進行字元串編碼轉換;比如lua-iconv(windows下需要自行編譯iconv)或者lc(推薦,用法非常簡單,http://download.csdn.net/download/alga_1/4115472)

2. lua 怎麼反編譯

1.Lua的虛擬機指令,5.2 的有40條

Lua的指令使用一個32bit的unsigned integer表示。所有指令的定義都在lopcodes.h文件中(可以從Lua 官方網站下
載),使用一個enum OpCode代表指令類型。在lua5.2中,總共有40種指令(id從0到39)。根據指令參數的不同,可以將所有指令分為4
類:

typedef enum {
/*----------------------------------------------------------------------
name args description

------------------------------------------------------------------------*/
OP_MOVE,/* A B R(A) := R(B) */
OP_LOADK,/* A Bx R(A) := Kst(Bx) */
OP_LOADKX,/* A R(A) := Kst(extra arg) */
OP_LOADBOOL,/* A B C R(A) := (Bool)B; if (C) pc++ */
OP_LOADNIL,/* A B R(A), R(A+1), ..., R(A+B) := nil */
OP_GETUPVAL,/* A B R(A) := UpValue[B] */

OP_GETTABUP,/* A B C R(A) := UpValue[B][RK(C)] */
OP_GETTABLE,/* A B C R(A) := R(B)[RK(C)] */

OP_SETTABUP,/* A B C UpValue[A][RK(B)] := RK(C) */
OP_SETUPVAL,/* A B UpValue[B] := R(A) */
OP_SETTABLE,/* A B C R(A)[RK(B)] := RK(C) */

OP_NEWTABLE,/* A B C R(A) := {} (size = B,C) */

OP_SELF,/* A B C R(A+1) := R(B); R(A) := R(B)[RK(C)] */

OP_ADD,/* A B C R(A) := RK(B) + RK(C) */
OP_SUB,/* A B C R(A) := RK(B) - RK(C) */
OP_MUL,/* A B C R(A) := RK(B) * RK(C) */
OP_DIV,/* A B C R(A) := RK(B) / RK(C) */
OP_MOD,/* A B C R(A) := RK(B) % RK(C) */
OP_POW,/* A B C R(A) := RK(B) ^ RK(C) */
OP_UNM,/* A B R(A) := -R(B) */
OP_NOT,/* A B R(A) := not R(B) */
OP_LEN,/* A B R(A) := length of R(B) */

OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */

OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A) + 1 */
OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */
OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */
OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */

OP_TEST,/* A C if not (R(A) <=> C) then pc++ */
OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */

OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */
OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */
OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */

OP_FORLOOP,/* A sBx R(A)+=R(A+2);
if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/
OP_FORPREP,/* A sBx R(A)-=R(A+2); pc+=sBx */

OP_TFORCALL,/* A C R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); */
OP_TFORLOOP,/* A sBx if R(A+1) ~= nil then { R(A)=R(A+1); pc += sBx }*/

OP_SETLIST,/* A B C R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B */

OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx]) */

OP_VARARG,/* A B R(A), R(A+1), ..., R(A+B-2) = vararg */

OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
} OpCode;

**********************************************************
虛擬機指令(2) MOVE & LOAD

OP_MOVE A B
OP_MOVE用來將寄存器B中的值拷貝到寄存器A中,由於Lua是基於寄存器虛擬機,大部分的指令都是直接對寄存器進行操作,而不需要對數據進行壓棧和彈棧。OP_MOVE 指令的作用 是將一個Local變數復制給另一個local變數.
例子:
local a = 10;
local b = a;
編譯出來的結果
1 [1] LOAD 0 1;1代表的是常量表的項,這里代表的是10
2 [2] MOVE 1 0
所代表的二進制為
B A OP_Code
Load 0 1 = 100000000 000000000 00000000 000001 = 0x80000001 ,
也就是說, 0x80000001 的二進制所代表的指令為 Load 0 1,這里B中的最高位為1,表示的B為常量表的序號,而不是寄存器

MOVE 1 0 = 000000000 000000000 00000001 000000 = 0x40

*****************華麗分割線***********************************************
1.lua 的二進制格式,官方的luac.exe 編譯出來的格式

原始的lua 腳本
local a = 10
local b = a
print(b)

下面介紹格式文件,介紹每個欄位的意思.當然啦,這種格式是官方的,各個游戲公司可能會做一些改動,但是萬變不離其宗。個個欄位已經用顏色標明了
在lua 的源文件中,前面四個位元組 1b 4c 75 61 也就是 \033Lua , 標識的是lua文件的特有的標示符數據格式,代表是lua
#define LUA_SIGNATURE "\033Lua" 033時八進制 = 0x1b ,很多那些反編譯工具判斷這四個位元組的值,來判斷是否能反編譯,很多公司都會偷偷的去掉或者用其他的值來替換,以迷惑菜鳥。呵呵

52 第五個位元組,表示的是,當前lua 的目標版本,這里指的是5.2 版本。
感覺編輯的好痛苦,我還是直接貼我的比較圖算了,看起來比較舒服

函數的頭描述
linedefined = 00 00 00 00 ;函數定義開始處的行號
linedefined = 00 00 00 00 ; 函數定義結束處的行號 ;頂級函數開始和結束行號都是為00
numparams = 00 ;固定參數的數目 number of fixed parameters
is_vararg = 01 ;可變參數標識符
• 1=VARARG_HASARG
• 2=VARARG_ISVARARG
• 4=VARARG_NEEDSARG
maxstacksize = 03 ;調用函數所需要的堆棧空間指令段
sizecode = 06 00 00 00 ; 函數中 指令的數目,緩存區的大小 = sizecode * sizeof(Instruction),每四個位元組為一條指令
code = 02 00 00 00 41 00 00 00 87 40 40 00 c1 00 80 00 a0 40 00 01 1e 00 80 00

常量列表 保存著函數中引用的常量的列表 (常量池)
Constant.sizek = 02 00 00 00 ;常量列表的大小 ,緩存區的大小 = Constant.sizek * sizeof(TValue) = 2 * 8 = 16,每項為8個位元組,
TValue * = 03 00 00 .
00 00 00 00 24 40 04 06 00 00 00 70 72 69 6e 74 [email protected]
Constant list 數據結構 保存著函數中引用的常量的列表 (常量池)
Integer 常量列表的大小 (sizek)
[
1 byte 常量類型 (value in parentheses): • 0=LUA_TNIL, 1=LUA_TBOOLEAN,• 3=LUA_TNUMBER, 4=LUA_TSTRING
Const 常量本身: 如果常量類型是0這個域不存在;如果類型是1,這個是0或1;如果類型是3這個域是 Number;如果類型是4 這個域是String。
]
這里的String 是包含"0"為結束的字元串

為什麼上傳圖片以後,圖片都變小了,而且不清晰呢?

***********************給大家發一點福利,矯正虛擬機指令的函數**************************************
//矯正虛擬機指令
DWORD Rectify(DWORD Source);
{
DWORD Instruction = Source;
BYTE Source_OpCode = Instruction & 0x3F;
switch(Source_OpCode)
{
case OP_MOVE:
Source_OpCode = Target_OpCode;
break;
...
}
Instruction = ((Instruction & 0xFFFFFFC0) | Source_OpCode);
return Instruction
}

3. lua腳本怎麼編譯成二進制

luac的參數提供完整路徑,或者在lua文件所在目錄打開命令行
另外請確認已正確設置環境變數(如在cmd下直接luac可以運行,即提示no input files give即可)

比如lua文件在E:\f1\f2\f3\a.lua的話
cmd ->
luac e:\f1\f2\f3\a.lua
或者
在資源管理器中瀏覽到f2,然後shift+右鍵f3,在此打開命令行 (僅win7,xp貌似沒這選項),然後luac a.lua
又或者
cmd ->
e: --打開E盤
cd f1\f2\f3 --cd命令進入f3
luac a.lua

4. 安卓手機如何打開.lua文件

01
lua文件是編寫lua腳本語言的文件,lua文件要打開的話要先看是什麼結尾的,如果是.lua或.wlua的話就可以直接打開,使用記事本查看。

lua是一種小巧的腳本語言,幾乎在所有操作系統和平台上都可以編譯。運行可以通過 Lua 的交互模式,也可以用記事本編輯代碼保存為 .lua 的格式,通過 lua 編譯器運行。也可以通過第三方工具,將 lua 打包獨立運行。

5. 怎樣把.lua編譯成.exe可執行文件(詳細點!最好附圖)

常見的方法是用c寫一個宿主
或者 比較方便而且比較現成的方法是載一個luaaio
aio就是all in one 的縮寫
把lua.exe改成腳本入口lua文件名
比如 main.lua 對應的就是main.exe 然後准備好相應的擴展需要的dll 就可以運行了

6. 擴展語言lua有哪些數據類型呢

Lua 中有八種基本類型: nil、boolean、number、string、function、userdata、 thread 和 table。

1.Nil 是值 nil 的類型, 其主要特徵就是和其它值區別開;通常用來表示一個有意義的值不存在時的狀態。 Boolean 是 false 與 true 兩個值的類型。 nil 和 false 都會導致條件判斷為假; 而其它任何值都表示為真。 Number 代表了整數和實數(浮點數)。 String 表示一個不可變的位元組序列。 Lua 對 8 位是友好的: 字元串可以容納任意 8 位值, 其中包含零 ('') 。 Lua 的字元串與編碼無關; 它不關心字元串中具體內容。
2.number 類型有兩種內部表現方式, 整數 和 浮點數。 對於何時使用哪種內部形式,Lu a 有明確的規則, 但它也按需作自動轉換。 因此,程序員多數情況下可以選擇忽略整數與浮點數之間的差異或者假設完全控制每個數字的內部表現方式。 標准 Lua 使用 64 位整數和雙精度(64 位)浮點數, 但你也可以把 Lua 編譯成使用 32 位整數和單精度(32 位)浮點數。 以 32 位表示數字對小型機器以及嵌入式系統特別合適。
3.Lua 可以調用(以及操作)用 L ua 或 C 編寫的函數。 這兩種函數有統一類型 function。
userdata 類型允許將 C 中的數據保存在 Lua 變數中。 用戶數據類型的值是一個內存塊, 有兩種用戶數據: 完全用戶數據 ,指一塊由 Lua 管理的內存對應的對象; 輕量用戶數據 ,則指一個簡單的 C 指針。 用戶數據在 Lua 中除了賦值與相等性判斷之外沒有其他預定義的操作。 通過使用 元表 ,程序員可以給完全用戶數據定義一系列的操作 。 你只能通過 C API 而無法在 Lua 代碼中創建或者修改用戶數據的值, 這保證了數據僅被宿主程序所控制。
4.thread 類型表示了一個獨立的執行序列,被用於實現協程 。 L ua 的線程與操作系統的線程毫無關系。 Lu a 為所有的系統,包括那些不支持原生線程的系統,提供了協程支持。
table 是一個關聯數組, 也就是說,這個數組不僅僅以數字做索引,除了 nil 和 NaN 之外的所有 Lua 值 都可以做索引。 (Not a Number 是一個特殊的數字,它用於表示未定義或表示不了的運算結果,比如 0/0。) 表可以是 異構 的; 也就是說,表內可以包含任何類型的值( nil 除外)。 任何鍵的值若為 nil 就不會被記入表結構內部。 換言之,對於表內不存在的鍵,都對應著值 nil 。
5.表是 Lua 中唯一的數據結構, 它可被用於表示普通數組、序列、符號表、集合、記錄、圖、樹等等。 對於記錄,Lua 使用域名作為索引。 語言提供了 a.name 這樣的語法糖來替代 a["name"] 這種寫法以方便記錄這種結構的使用。 在 Lua 中有多種便利的方式創建表。

7. LUA怎麼像C語言一樣編譯生成可執行文件

下載源代碼,解壓

解壓後,包含文件:
1、doc 文件夾,lua的更新說明,網頁格式
2、src 文件夾,lua的源文件,C語言實現
3、Makefile , 編譯用配置文件,我們這里就不用它了
4、README , 不用我說了吧,就一說明文件,我們也用不著

進入src文件夾,新建一個文本文件。並改名為vslua.bat,提示是否更改後綴名,選擇是並點擊。

右鍵我們建立的vslua.bat文件,以記事本打開

編寫如圖代碼,為了鍛煉大家的動手能力,加深理解,我就直接上圖不打文字。反正一定能看清的。記得編寫後保存哦!

到開始菜單選擇vs的開發人員命令提示工具。

在命令工具中輸入:
1、「cd x:\你的src文件夾路徑\src」[不包含引號],回車
2、「vslua.bat」 回車
等待執行結束。如果不錯的話,你到src上級目錄就能發現新生成了一個bin文件夾。文件夾裡面放的就是生成好的exe、lib、dll。

最後測試一下新生成的lua.exe。

熱點內容
三位密碼鎖忘記密碼如何重置 發布:2025-09-18 10:21:52 瀏覽:182
linux怎麼編譯c文件 發布:2025-09-18 09:55:16 瀏覽:302
python安裝後無法運行 發布:2025-09-18 09:45:57 瀏覽:236
安卓手機怎麼剪輯音樂 發布:2025-09-18 09:44:16 瀏覽:781
伺服器地址修改在哪找 發布:2025-09-18 09:42:41 瀏覽:441
sntp伺服器地址 發布:2025-09-18 09:28:36 瀏覽:552
phpunit 發布:2025-09-18 09:25:19 瀏覽:571
怎麼改伺服器的ip地址嗎 發布:2025-09-18 09:24:33 瀏覽:12
編譯703n固件 發布:2025-09-18 08:50:59 瀏覽:541
三星手機系統文件夾是哪個文件夾 發布:2025-09-18 08:48:45 瀏覽:284