32.12. dis — Python 字节码的反汇编器 — Python 文档
来自菜鸟教程
Python/docs/2.7/library/dis
32.12. 迪斯 — Python 字节码的反汇编器
源代码: :source:`Lib/dis.py`
dis 模块支持对 CPython bytecode 进行反汇编分析。 该模块作为输入的 CPython 字节码在文件 Include/opcode.h
中定义,并由编译器和解释器使用。
示例:给定函数 myfunc()
:
def myfunc(alist):
return len(alist)
以下命令可用于获取myfunc()
的反汇编:
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
3 LOAD_FAST 0 (alist)
6 CALL_FUNCTION 1
9 RETURN_VALUE
(“2”是行号)。
dis 模块定义了以下函数和常量:
- dis.dis([bytesource])
- 反汇编 bytesource 对象。 bytesource 可以表示模块、类、方法、函数或代码对象。 对于一个模块,它反汇编了所有功能。 对于一个类,它反汇编所有方法。 对于单个代码序列,它为每个字节码指令打印一行。 如果没有提供对象,它会反汇编最后的回溯。
- dis.distb([tb])
- 反汇编回溯的栈顶函数,如果没有传递,则使用最后一个回溯。 指示导致异常的指令。
- dis.disassemble(code[, lasti])
反汇编代码对象,如果提供了 lasti,则指示最后一条指令。 输出分为以下列:
行号,用于每行的第一条指令
当前指令,表示为
-->
,一个带标签的指令,用
>>
表示,指令的地址,
操作代码名称,
操作参数,和
括号中参数的解释。
参数解释识别局部和全局变量名称、常量值、分支目标和比较运算符。
- dis.disco(code[, lasti])
- disassemble() 的同义词。 键入更方便,并保持与早期 Python 版本的兼容性。
- dis.findlinestarts(code)
- 此生成器函数使用代码对象 code 的
co_firstlineno
和co_lnotab
属性来查找作为源代码中行开头的偏移量。 它们生成为(offset, lineno)
对。
- dis.findlabels(code)
- 检测代码对象 code 中作为跳转目标的所有偏移量,并返回这些偏移量的列表。
- dis.opname
- 操作名称序列,可使用字节码索引。
- dis.opmap
- 字典将操作名称映射到字节码。
- dis.cmp_op
- 所有比较操作名称的顺序。
- dis.hasconst
- 访问常量的字节码序列。
- dis.hasfree
- 访问自由变量的字节码序列。
- dis.hasname
- 按名称访问属性的字节码序列。
- dis.hasjrel
- 具有相对跳转目标的字节码序列。
- dis.hasjabs
- 具有绝对跳转目标的字节码序列。
- dis.haslocal
- 访问局部变量的字节码序列。
- dis.hascompare
- 布尔运算的字节码序列。
32.12.1. Python 字节码说明
Python 编译器当前生成以下字节码指令。
一元运算取栈顶,应用运算,并将结果压回到栈中。
二元运算从堆栈中删除堆栈顶部 (TOS) 和第二个最顶部堆栈项 (TOS1)。 他们执行操作,并将结果放回堆栈中。
就地操作类似于二元操作,因为它们删除 TOS 和 TOS1,并将结果推回到堆栈上,但是当 TOS1 支持时,操作就地完成,结果 TOS 可能(但没有是)原来的TOS1。
切片操作码最多采用三个参数。
切片分配甚至需要一个额外的参数。 与任何语句一样,它们没有在堆栈中放置任何内容。
各种操作码。
以下所有操作码都需要参数。 一个参数是两个字节,最后一个更重要的字节。