cob*_*bie 10 python bytecode virtual-machine
我已经反汇编了以下python代码
def factorial(n):
if n <= 1:
return 1
elif n == 2:
return 2
elif n ==4:
print('hi')
return n * 2
Run Code Online (Sandbox Code Playgroud)
以及生成的字节码
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
Run Code Online (Sandbox Code Playgroud)
上述字节码中的">>"符号代表什么?
Mar*_*ers 12
他们是跳跃目标; 位置较早的*JUMP*字节码跳转到满足条件时.
第一跳:
9 POP_JUMP_IF_FALSE 16
Run Code Online (Sandbox Code Playgroud)
跳转到偏移16,所以在偏移16处,输出有一个目标>>:
4 >> 16 LOAD_FAST 0 (n)
Run Code Online (Sandbox Code Playgroud)
从dis.disassemble()函数docs中命名每一列:
[...]
- 带标签的指示,标有
>>,
检测作为跳转目标的代码对象代码中的所有偏移量,并返回这些偏移量的列表.
| 归档时间: |
|
| 查看次数: |
542 次 |
| 最近记录: |