Lua5.3 虚拟机指令分析(八)循环
while
Lua 处了 for 循环之外的其它各种循环(while)都使用关系和逻辑指令,配合JMP 指令来完成。
TTcs-Mac-mini:OpCode ttc$ cat tOP_WHILE.lua
local a = 0;
while(a < 10) do
a = a + 1;
end
print(a)
TTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_WHILE.lua
main <tOP_WHILE.lua:0,0> (9 instructions at 0x7ff365c039c0)
0+ params, 3 slots, 1 upvalue, 1 local, 4 constants, 0 functions
1 [1] LOADK (iABx) [A]0 [K]-1 ; 0
2 [2] LT (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-2 ; - 10
3 [2] JMP (iAsBx) [A]0 [sBx]2 ; to 6
4 [3] ADD (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-3 ; - 1
5 [3] JMP (iAsBx) [A]0 [sBx]-4 ; to 2
6 [6] GETTABUP (iABC) [A]1 [ISK]0[B]0[ISK]256[C]-4 ; _ENV "print"
7 [6] MOVE (iABC) [A]2 [ISK]0[B]0[ISK]0
8 [6] CALL (iABC) [A]1 [ISK]0[B]2[ISK]0[C]1
9 [6] RETURN (iABC) [A]0 [ISK]0[B]1[ISK]0
constants (4) for 0x7ff365c039c0:
1(idx) 0
2(idx) 10
3(idx) 1
4(idx) "print"
locals (1) for 0x7ff365c039c0:
0 a(name) 2(startpc) 10(endpc)
upvalues (1) for 0x7ff365c039c0:
0 _ENV(name) 1(instack) 0(idx)
TTcs-Mac-mini:OpCode ttc$
第二条指令 使用LT 对寄存器 0 和 常量 10 比较,如果结果 与 A 为 1 (true) 比较 不相等(false),则跳过第三条指令 JMP ,执行第四条指令 ADD ,将寄存器