Вы можете использовать py_to_asm
(отказ от ответственности: я написал библиотеку) для генерации x86-64
сборки с синтаксисом at&t
.
Вы можете создавать assembly
программы, создавая экземпляр класса py_to_asm.Asm
с contextmanager
или с помощью простого создания экземпляра. Используя contextmanager
, можно создать метку main
:
import py_to_asm
with py_to_asm.Asm(_label_name = '_main', is_main=True) as asm: #assembly to add two values
asm.mov(asm.register.EAX, asm.integer(2))
asm.mov(asm.register.EDX, asm.integer(5))
asm.add(asm.register.EAX, asm.register.EDX)
print(asm)
Выход:
.data
.text
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $2, %eax
movl $5, %edx
addl %edx, %eax
leave
ret
Вы также можете создать экземпляр класса py_to_asm.Asm
просто для создания переменных, регистров и значений:
_asm = py_to_asm.Asm()
all_registers = _asm.register.__class__.registers
register_storage = _asm.register.EAX.__class__.converter
eax = _asm.register.EAX
edx = _asm.register.EDX
val = _asm.integer(2)
print(all_registers)
print(register_storage)
print(eax, edx, val)
Выход:
['RAX', 'RCX', 'RDX', 'RBX', 'RSP', 'RBP', 'RSI', 'RDI', 'EAX', 'ECX', 'EDX', 'EBX', 'ESP', 'EBP', 'ESI', 'EDI', 'AX', 'CX', 'DX', 'BX', 'SP', 'BP', 'SI', 'DI', 'AH', 'AL', 'CH', 'CL', 'DH', 'DL', 'BH', 'BL']
{'RAX': 64, 'RCX': 64, 'RDX': 64, 'RBX': 64, 'RSP': 64, 'RBP': 64, 'RSI': 64, 'RDI': 64, 'EAX': 32, 'ECX': 32, 'EDX': 32, 'EBX': 32, 'ESP': 32, 'EBP': 32, 'ESI': 32, 'EDI': 32, 'AX': 16, 'CX': 16, 'DX': 16, 'BX': 16, 'SP': 16, 'BP': 16, 'SI': 16, 'DI': 16, 'AH': 8, 'AL': 8, 'CH': 8, 'CL': 8, 'DH': 8, 'DL': 8, 'BH': 8, 'BL': 8}
%eax %edx $2
Чтобы создать исполняемый файл из сгенерированной сборки, сначала запишите сгенерированное содержимое в файл:
with asm.write('garbage_code.s'):
pass
Затем в терминале / командной строке запустите:
gcc garbage_code.s -o garbage_executable
garbage_executable
теперь имя исполняемого файла.