Lua5.3 虚拟机指令分析(三)表达式运算

来源:互联网 发布:unity3d汽车模型下载 编辑:程序博客网 时间:2024/06/06 23:08

Lua5.3 虚拟机指令分析(三)表达式运算

二元运算

TTcs-Mac-mini:OpCode ttc$ cat tOP_Arith.lua local t = 1t = t + 1t = t - 1t = t * 1t = t / 1t = t % 1t = t ^ 1t = t // 1t = t & 1t = t | 1t = t ~ 1t = t << 1t = t >> 1TTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_Arith.luamain <tOP_Arith.lua:0,0> (14 instructions at 0x7f87df4039b0)0+ params, 2 slots, 1 upvalue, 1 local, 1 constant, 0 functions    1   [1] LOADK       (iABx) [A]0 [K]-1   ; 1    2   [2] ADD         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    3   [3] SUB         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    4   [4] MUL         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    5   [5] DIV         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    6   [6] MOD         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1    7   [7] POW         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    8   [8] IDIV        (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    9   [9] BAND        (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    10  [10]    BOR         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    11  [11]    BXOR        (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    12  [12]    SHL         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    13  [13]    SHR         (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; - 1    14  [13]    RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0constants (1) for 0x7f87df4039b0:    1(idx)  1locals (1) for 0x7f87df4039b0:    0   t(name)      2(startpc)     15(endpc)upvalues (1) for 0x7f87df4039b0:    0    _ENV(name)      1(instack)      0(idx)TTcs-Mac-mini:OpCode ttc$ 

B和C两个操作数计算的结果存入A;每个指令都对应一个完整的二元计算操作,生成的指令没有多余的操作。

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_MOD,/*   A B C   R(A) := RK(B) % RK(C)               */OP_POW,/*   A B C   R(A) := RK(B) ^ RK(C)               */OP_DIV,/*   A B C   R(A) := RK(B) / RK(C)               */OP_IDIV,/*  A B C   R(A) := RK(B) // RK(C)              */OP_BAND,/*  A B C   R(A) := RK(B) & RK(C)               */OP_BOR,/*   A B C   R(A) := RK(B) | RK(C)               */OP_BXOR,/*  A B C   R(A) := RK(B) ~ RK(C)               */OP_SHL,/*   A B C   R(A) := RK(B) << RK(C)              */OP_SHR,/*   A B C   R(A) := RK(B) >> RK(C)              */

一元运算

将 寄存器 B 取反(not bnot) 后放入 寄存器 A 中。

TTcs-Mac-mini:OpCode ttc$ cat tOP_Arith_2.lua local t = 10t = not tt = -at = ~tTTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_Arith_2.luamain <tOP_Arith_2.lua:0,0> (6 instructions at 0x7fe54dc039c0)0+ params, 2 slots, 1 upvalue, 1 local, 2 constants, 0 functions    1   [1] LOADK       (iABx) [A]0 [K]-1   ; 10    2   [2] NOT         (iABC) [A]0 [ISK]0[B]0[ISK]0    3   [3] GETTABUP    (iABC) [A]1 [ISK]0[B]0[ISK]256[C]-2 ; _ENV "a"    4   [3] UNM         (iABC) [A]0 [ISK]0[B]1[ISK]0    5   [4] BNOT        (iABC) [A]0 [ISK]0[B]0[ISK]0    6   [4] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0constants (2) for 0x7fe54dc039c0:    1(idx)  10    2(idx)  "a"locals (1) for 0x7fe54dc039c0:    0   t(name)      2(startpc)     7(endpc)upvalues (1) for 0x7fe54dc039c0:    0    _ENV(name)      1(instack)      0(idx)TTcs-Mac-mini:OpCode ttc$ OP_UNM,/*   A B R(A) := -R(B)                   */OP_BNOT,/*  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_LEN

LEN直接对应’#’操作符,返回B对象的长度,并保存到A中。

TTcs-Mac-mini:OpCode ttc$ cat tOP_LEN.lua local a = "hello TTc!"local b =  #aTTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_LEN.luamain <tOP_LEN.lua:0,0> (3 instructions at 0x7fb33ac039b0)0+ params, 2 slots, 1 upvalue, 2 locals, 1 constant, 0 functions    1   [1] LOADK       (iABx) [A]0 [K]-1   ; "hello TTc!"    2   [2] LEN         (iABC) [A]1 [ISK]0[B]0[ISK]0    3   [2] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0constants (1) for 0x7fb33ac039b0:    1(idx)  "hello TTc!"locals (2) for 0x7fb33ac039b0:    0   a(name)      2(startpc)     4(endpc)    1   b(name)      3(startpc)     4(endpc)upvalues (1) for 0x7fb33ac039b0:    0    _ENV(name)      1(instack)      0(idx)TTcs-Mac-mini:OpCode ttc$

OP_CONCAT

CONCAT将 B 和 C 指定范围内的字符串按顺序传接到一起,将结果存入到 寄存器 A。

TTcs-Mac-mini:OpCode ttc$ cat tOP_CONCAT.lua local a = "TTc"local b = "Hello"local c = b..aTTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_CONCAT.luamain <tOP_CONCAT.lua:0,0> (6 instructions at 0x7fe6b5c039b0)0+ params, 4 slots, 1 upvalue, 3 locals, 2 constants, 0 functions    1   [1] LOADK       (iABx) [A]0 [K]-1   ; "TTc"    2   [2] LOADK       (iABx) [A]1 [K]-2   ; "Hello"    3   [3] MOVE        (iABC) [A]2 [ISK]0[B]1[ISK]0    4   [3] MOVE        (iABC) [A]3 [ISK]0[B]0[ISK]0    5   [3] CONCAT      (iABC) [A]2 [ISK]0[B]2[ISK]0[C]3    6   [3] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0constants (2) for 0x7fe6b5c039b0:    1(idx)  "TTc"    2(idx)  "Hello"locals (3) for 0x7fe6b5c039b0:    0   a(name)      2(startpc)     7(endpc)    1   b(name)      3(startpc)     7(endpc)    2   c(name)      6(startpc)     7(endpc)upvalues (1) for 0x7fe6b5c039b0:    0    _ENV(name)      1(instack)      0(idx)TTcs-Mac-mini:OpCode ttc$ 
原创粉丝点击