DEV Community

Cover image for Disassembling Python Bytecode with the dis Library
≀Paulo Portela
≀Paulo Portela

Posted on • Edited on

Disassembling Python Bytecode with the dis Library

Introduction

The dis module in Python provides a disassembler for Python bytecode. This means that it can take a compiled Python code object and display a human-readable version of the instructions that the Python interpreter will execute. This can be useful for understanding how Python code is executed, for debugging, and reverse engineering.

In this chapter, we will explore the dis library in Python, its syntax, and how it can be used in mathematical contexts.

The dis Module in Python

The dis module provides several functions for working with Python bytecode. The most commonly used function is dis.dis, which disassembles a code object and displays the resulting bytecode in a human-readable format. Here is an example that demonstrates the use of the dis.dis function:

import dis

def factorial(n: int) -> int:
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

dis.dis(factorial)
Enter fullscreen mode Exit fullscreen mode

Output:

  4           0 RESUME                   0

  5           2 LOAD_FAST                0 (n)
              4 LOAD_CONST               1 (0)
              6 COMPARE_OP              40 (==)
             10 POP_JUMP_IF_FALSE        1 (to 14)

  6          12 RETURN_CONST             2 (1)

  8     >>   14 LOAD_FAST                0 (n)
             16 LOAD_GLOBAL              1 (NULL + factorial)
             26 LOAD_FAST                0 (n)
             28 LOAD_CONST               2 (1)
             30 BINARY_OP               10 (-)
             34 CALL                     1
             42 BINARY_OP                5 (*)
             46 RETURN_VALUE
Enter fullscreen mode Exit fullscreen mode

In this example, we define a recursive function factorial that calculates the factorial of a non-negative integer n. We then use the dis.dis function to disassemble the code object of the factorial function. The output shows the bytecode instructions that the Python interpreter will execute when the factorial function is called.

Examples with Math

Here are some examples that demonstrate the use of the dis library in mathematical contexts:

Example 1: Disassembling a Fibonacci Function

import dis

def fibonacci(n: int) -> int:
    if n <= 1:
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

dis.dis(fibonacci)
Enter fullscreen mode Exit fullscreen mode

Output:

  4           0 RESUME                   0

  5           2 LOAD_FAST                0 (n)
              4 LOAD_CONST               1 (1)
              6 COMPARE_OP              26 (<=)
             10 POP_JUMP_IF_FALSE        2 (to 16)

  6          12 LOAD_FAST                0 (n)
             14 RETURN_VALUE

  8     >>   16 LOAD_GLOBAL              1 (NULL + fibonacci)
             26 LOAD_FAST                0 (n)
             28 LOAD_CONST               1 (1)
             30 BINARY_OP               10 (-)
             34 CALL                     1
             42 LOAD_GLOBAL              1 (NULL + fibonacci)
             52 LOAD_FAST                0 (n)
             54 LOAD_CONST               2 (2)
             56 BINARY_OP               10 (-)
             60 CALL                     1
             68 BINARY_OP                0 (+)
             72 RETURN_VALUE
Enter fullscreen mode Exit fullscreen mode

In this example, we define a recursive function fibonacci that calculates the n-th number in the Fibonacci sequence. We then use the dis.dis function to disassemble the code object of the fibonacci function. The output shows the bytecode instructions that the Python interpreter will execute when the fibonacci function is called.

Conclusion

In this chapter, we have explored the dis library in Python, its syntax, and how it can be used in mathematical contexts. We have seen how the dis.dis function can be used to disassemble a code object and display the resulting bytecode in a human-readable format. Through examples, we have demonstrated the use of the dis library in disassembling factorial and Fibonacci functions.

Top comments (0)