与 python 字节码相关的最接近的程序集

Closest assembly related to python bytecode

我有以下基本 python 功能:

def squared(num):
    if num < 2:
        print ('OK!')
    return num * num

产生以下字节码:

>>> dis.dis(squared)
  2           0 LOAD_FAST                0 (num)
              3 LOAD_CONST               1 (2)
              6 COMPARE_OP               0 (<)
              9 POP_JUMP_IF_FALSE       20

  3          12 LOAD_CONST               2 ('OK!')
             15 PRINT_ITEM          
             16 PRINT_NEWLINE       
             17 JUMP_FORWARD             0 (to 20)

  4     >>   20 LOAD_FAST                0 (num)
             23 LOAD_FAST                0 (num)
             26 BINARY_MULTIPLY     
             27 RETURN_VALUE        

上面的大部分看起来像 movjmp 类型的运算符。但是,以下在汇编中最接近的意思是什么?

LOAD_FAST, LOAD_CONST ?

最接近的汇编指令是什么?

Python 的字节码用于基于堆栈的 VM,以通过使地址(例如寄存器编号)隐式化来简化解释器并减少 space 在地址(例如寄存器编号)上的浪费。负载正在推到那个堆栈上。

如果您以非常直白和脑残的方式将其音译为固定宽度整数的 asm 等价物(不像 Python 任意精度整数),每个 LOAD_FAST 都可能是来自本地的负载变量(在堆栈上的内存中)到寄存器中。但是您仍然必须选择哪些寄存器,而真正的 ISA 的寄存器数量有限。但是,是的,LOAD_FAST 就像一个负载。

当然,如果您不是为了它而故意写字面意思,您就会知道寄存器中已经有 num 而不会再次加载它。所以你会使用一条指令读取同一个寄存器两次,比如 imul eax, eax

并且尽可能让局部变量存在于寄存器中,而不是首先将它们溢出到堆栈,直到 运行 超出寄存器。


如果你想了解 CPU 的 asm,你可以用 C 编写一个等效的函数并编译它(启用优化,至少 -Og 如果不是 -O2-O3) 在 Godbolt 编译器资源管理器上:https://godbolt.org/. Or on your desktop, but Matt Godbolt wrote some nice filtering to remove noise and leave only the interesting parts. See also