与 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
上面的大部分看起来像 mov
和 jmp
类型的运算符。但是,以下在汇编中最接近的意思是什么?
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
我有以下基本 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
上面的大部分看起来像 mov
和 jmp
类型的运算符。但是,以下在汇编中最接近的意思是什么?
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