これによって出てきたアセンブリはどのようにして実行できますか?
の答えは、
python
1>>> print_text()
2Hello
です。
逆アセンブラは実行可能なコードを人間が読みやすいニーモニックに変換しているだけです。
したがって、実行する方法は元の関数を実行することです。
元のバイトコードは以下です。
python
1>>> print_text.__code__
2<code object print_text at 0x000002D2A1B48030, file "<stdin>", line 1>
このバイト列を逆アセンブルしたものが以下のものですね。
python
1>>> dis.dis(print_text)
2 2 0 LOAD_GLOBAL 0 (print)
3 2 LOAD_CONST 1 ('Hello')
4 4 CALL_FUNCTION 1
5 6 POP_TOP
6 8 LOAD_CONST 0 (None)
7 10 RETURN_VALUE
関数print_textを直接呼び出さずにコードを実行したければexecを使うこともできます。
以下のようにやってください。
python
1>>> code = print_text.__code__
2>>> print(code)
3<code object print_text at 0x000002D2A1B48030, file "<stdin>", line 1>
4>>> exec(code)
5Hello
Pythonバイトコードの説明は、Python バイトコード命令を見てください。
どの命令がどういうバイトに対応しているかを知りたければ、Pythonのソースをダウンロードして、Includeにある.hファイルを見てください。多分code.hだったと思います。
opcode.hでした。
バイトコード自体を見たければ、
python
1>>> print(print_text.__code__.co_code)
2b't\x00d\x01\x83\x01\x01\x00d\x00S\x00'
で表示されるものです。
これと逆アセンブルした結果を見比べれば意味は分かります。
ただし、この表示では最初のバイトがtと表示されているので、全てを16進表示に変更した方が見やすい出しょう。