[英]Create Python bytecode from list of opcodes and arguments?
有沒有一種簡單的方法可以從帶有操作碼及其參數的2元組列表中創建Python字節碼?
例如:
>>> bytecode_compile([
('LOAD_CONST', 2),
('STORE_FAST', 'a'),
('LOAD_FAST', 'a'),
('RETURN_VALUE',)])
'd\x01\x00}\x00\x00|\x00\x00S'
我在這里詳細寫了這個,所以我不再重復,但會給出一些總結性評論。
這絕對是可行的,但我想知道它有多普遍有用。 鏈接進入如何運行和寫出這些東西。
字節碼在操作碼,操作碼名稱或版本之間操作碼的語義方面都會發生變化。 實際上,在Python 3.6及更高版本中,字節碼變成了字碼。
如果您決定沿着這條路走下去,xdis最近添加了一個list2bytecode()
函數來做這件事。
如果您希望在編寫大多數匯編代碼時使用文本文件,我會為此編寫xasm 。 以下是一些可以使用的格式的示例程序集:
# Python bytecode 3.6 (3379)
# Method Name: five
# Filename: /tmp/five.pl
# Argument count: 0
# Kw-only arguments: 0
# Number of locals: 0
# Stack size: 1
# Flags: 0x00000043 (NOFREE | NEWLOCALS | OPTIMIZED)
# First Line: 1
# Constants:
# 0: None
# 1: 5
2:
LOAD_CONST (5)
RETURN_VALUE
# Method Name: <module>
# Filename: /tmp/five.pl
# Argument count: 0
# Kw-only arguments: 0
# Number of locals: 0
# Stack size: 2
# Flags: 0x00000040 (NOFREE)
# First Line: 1
# Constants:
# 0: <code object five at 0x0000>
# 1: 'five'
# 2: None
# Names:
# 0: five
# 1: print
1:
LOAD_CONST 0 (<code object five at 0x0000>)
LOAD_CONST ('five')
MAKE_FUNCTION 0
STORE_NAME (five)
3:
LOAD_NAME (print)
LOAD_NAME (five)
CALL_FUNCTION 0
CALL_FUNCTION 1
POP_TOP
LOAD_CONST (None)
RETURN_VALUE
我不認為Python“字節碼匯編”匯編程序存在,但是自己構建匯編程序可能並不困難。 在Python-XYZ / Include / opcode.h中的python源代碼中,操作碼的所有字節碼都列出了它們采用的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.