【问题标题】:lua ternary operator possibilitieslua 三元运算符的可能性
【发布时间】:2021-04-27 08:48:24
【问题描述】:

我尝试从已编译的操作码中恢复 lua 码。我希望你能帮我解决这个问题。

195 [-] GETTABLE    7 0 177 ; "formcontainer"
196 [-] GETTABLE    7 7 178 ; "form"
197 [-] GETTABLE    8 7 179 ; "elements"
198 [-] GETTABLE    8 8 180 ; "appear"
199 [-] TEST        5 5 0
200 [-] JMP         0 3 ; to 204
201 [-] MOVE        9 6 0
202 [-] JMP         0 2 ; to 205
203 [-] LOADBOOL    9 0 1
204 [-] LOADBOOL    9 1 0
205 [-] SETTABLE    8 181 9 ; "hidden" 

这就是它的全部代码。 我已经恢复的是这部分:

form.elements["appear"].hidden =

第 195 到 198 行只是获取正确的表并将其临时存储在寄存器 8 (r8) 中的第 199 到 204 行中应存储的值确定并临时设置为 r9,因此可以将其设置为成员r8的隐藏。

r5 被称为 bCouldBeXLive 并且 r6 是 bIsGalaxy 我确定是这样的

form.elements["appear"].hidden = if bCouldBeXLive then bIsGalaxy else true end

但这不是有效的 lua 5.0.2 代码。

已经试过了

form.elements["appear"].hidden = bCouldBeXLive and bIsGalaxy or true

但这会以两次 TEST 操作结束。

195 [-] GETTABLE    7 0 177 ; "formcontainer"
196 [-] GETTABLE    7 7 178 ; "form"
197 [-] GETTABLE    8 7 179 ; "elements"
198 [-] GETTABLE    8 8 180 ; "appear"
199 [-] TEST        5 5 0
200 [-] JMP         0 2 ; to 203
201 [-] TEST        9 6 1
202 [-] JMP         0 1 ; to 204
203 [-] LOADBOOL    9 1 0                   
204 [-] SETTABLE    8 181 9 ; "hidden" 

特别是原始操作码的第 203 行让我感到惊讶,因为它从未执行过。

对我来说,操作码看起来像一个三元运算符。你知道适合原始操作码的变体吗?

【问题讨论】:

  • 第二个字节码列表与此码一致:local a,b,c,d,e,bCouldBeXLive,bIsGalaxy local t=a.formcontainer.form t.elements["appear"].hidden = bCouldBeXLive and bIsGalaxy or true
  • 这正是我在原始帖子中所写的。我正在寻找第一个代码清单

标签: lua bytecode opcode


【解决方案1】:

反编译后的代码是:

R7 = R0.formcontainer.form
R7.elements.appear.hidden = not bCouldBeXLive or bIsGalaxy

特别是原始操作码的第 203 行让我吃惊,因为它从未执行过。

指令 #203 计算值not bCouldBeXLive
Lua 字节码生成器根本没有优化,所以 not bCouldBeXLive 的虚假值永远不会进入最终结果这一事实不会导致删除不可访问的代码。

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 2018-04-03
    • 1970-01-01
    • 2018-08-07
    • 2017-11-19
    • 2020-04-07
    • 2016-07-19
    • 2020-10-11
    • 2012-09-02
    相关资源
    最近更新 更多