Lua5.3 虚拟机指令分析(八)循环

本文详细介绍了Lua5.3虚拟机中的循环实现,包括while循环和for循环。while循环利用关系和逻辑指令配合JMP完成。for循环分为numeric for和generic for,前者使用3个局部变量控制,后者通过调用closure实现迭代。在numeric for中,循环计数器不受外部修改i的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 ,将寄存器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值