【问题标题】:Meaning of '>>' in Python byte codePython字节码中“>>”的含义
【发布时间】:2016-10-20 10:13:16
【问题描述】:

我已经反汇编了下面的python代码

def factorial(n):
    if n <= 1:
        return 1
    elif n == 2:
        return 2
    elif n ==4:
        print('hi')
    return n * 2

以及生成的字节码

 2        0 LOAD_FAST                0 (n)
          3 LOAD_CONST               1 (1)
          6 COMPARE_OP               1 (<=)
          9 POP_JUMP_IF_FALSE         16

3        12 LOAD_CONST               1 (1)
         15 RETURN_VALUE        

4     >> 16 LOAD_FAST                0 (n)
         19 LOAD_CONST               2 (2)
         22 COMPARE_OP               2 (==)
         25 POP_JUMP_IF_FALSE        32

5        28 LOAD_CONST               2 (2)
         31 RETURN_VALUE        

6     >> 32 LOAD_FAST                0 (n)
         35 LOAD_CONST               3 (4)
         38 COMPARE_OP               2 (==)
         41 POP_JUMP_IF_FALSE        52

7        44 LOAD_CONST               4 ('hi')
         47 PRINT_ITEM          
         48 PRINT_NEWLINE       
         49 JUMP_FORWARD             0 (to 52)

8     >> 52 LOAD_FAST                0 (n)
         55 LOAD_CONST               2 (2)
         58 BINARY_MULTIPLY     
         59 RETURN_VALUE        

上述字节码中的“>>”符号代表什么?

【问题讨论】:

  • 看起来像 POP_JUMP_IF_FALSE 的目标。见这篇文章:Understanding Python Bytecode
  • @self:不,右移是BINARY_RSHIFTINPLACE_RSHIFT

标签: python virtual-machine bytecode


【解决方案1】:

它们是跳跃目标;满足条件时,*JUMP* 字节码会跳转到较早的位置。

第一次跳跃:

         9 POP_JUMP_IF_FALSE       16

跳转到偏移量 16,因此在偏移量 16 处,输出有一个目标 &gt;&gt;

4     >> 16 LOAD_FAST                0 (n)

dis.disassemble() function docs 命名每一列:

[...]

  1. 带标签的指令,用&gt;&gt; 表示,

还有dis.findlabels() function:

检测代码对象代码中作为跳转目标的所有偏移量,并返回这些偏移量的列表。

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 2010-11-12
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2020-02-27
    • 2020-06-22
    相关资源
    最近更新 更多