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$
阅读全文
0 0
- Lua5.3 虚拟机指令分析(三)表达式运算
- Lua5.3 VM 分析(三)表达式运算
- Lua5.3 虚拟机指令分析(二)赋值指令
- Lua5.3 虚拟机指令分析(十)表相关指令
- Lua5.3 虚拟机指令分析(一)概述
- Lua5.3 虚拟机指令分析(四)分支与跳转
- Lua5.3 虚拟机指令分析(五)函数调用
- Lua5.3 虚拟机指令分析(六)不定参数
- Lua5.3 虚拟机指令分析(八)循环
- 探索Lua5.2内部实现:虚拟机指令(3) Upvalues & Globals
- 探索Lua5.2内部实现:虚拟机指令(5)Arithmetic
- 探索Lua5.2内部实现:虚拟机指令(6)FUNCTION
- 探索Lua5.2内部实现:虚拟机指令(1) 概述
- 探索Lua5.2内部实现:虚拟机指令(2) MOVE & LOAD
- 探索Lua5.2内部实现:虚拟机指令(4) Table
- 探索Lua5.2内部实现:虚拟机指令(8) LOOP
- Lua5.3 VM 分析(一)字节码运行
- Lua5.3 VM 分析(二)表处理
- 算法学习之枚举--称硬币
- Java大整数 大浮点数 处理
- xlistview用法
- Laravel使用Form Request使你的Controller更整洁
- Android之Notification学习及使用
- Lua5.3 虚拟机指令分析(三)表达式运算
- 虚拟机共享文件夹的建立和vim编辑命令
- 将本地资料上传至服务器
- 抽象类VS接口
- Ubuntu12.04文件修改eth0的IP
- this引用
- 【深度学习入门—2015MLDS】台湾大学李宏毅MLDS(2015)学习笔记
- iOS开发常用方法的封装
- php 使用面向过程开发博客(1)