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,则指示最后一条指令。 输出分为以下列:

  1. 行号,用于每行的第一条指令

  2. 当前指令,表示为-->

  3. 一个带标签的指令,用 >> 表示,

  4. 指令的地址,

  5. 操作代码名称,

  6. 操作参数,和

  7. 括号中参数的解释。

参数解释识别局部和全局变量名称、常量值、分支目标和比较运算符。

dis.disco(code[, lasti])
disassemble() 的同义词。 键入更方便,并保持与早期 Python 版本的兼容性。
dis.findlinestarts(code)
此生成器函数使用代码对象 codeco_firstlinenoco_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。

切片操作码最多采用三个参数。

切片分配甚至需要一个额外的参数。 与任何语句一样,它们没有在堆栈中放置任何内容。

各种操作码。

以下所有操作码都需要参数。 一个参数是两个字节,最后一个更重要的字节。