簡體   English   中英

從操作碼和參數列表創建Python字節碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM