Skip to main content

Python library for writing assembly code through object abstractions

Project description

flexpasm

Python library for writing assembly code through object abstractions. For Linux FASM.
Explore the docs »

Getting Started · Basic Usage · Specifications · License


flexpasm is a library for assembly language metaprogramming (FASM LINUX) via OOP, object relations. It also includes several useful tools for working with assembly code

Python library for writing assembly code through object abstractions. For Linux FASM.

Check Other My Projects

  • SQLSymphony - simple and fast ORM in sqlite (and you can add other DBMS)
  • Burn-Build - simple and fast build system written in python for C/C++ and other projects. With multiprocessing, project creation and caches!
  • OptiArch - shell script for fast optimization of Arch Linux
  • libnumerixpp - a Powerful C++ Library for High-Performance Numerical Computing
  • pycolor-palette - display beautiful log messages, logging, debugging.
  • shegang - powerful command interpreter (shell) for linux written in C
  • aioconsole - simple python library for creating async CLI applications

Getting Started

flexpasm is available on PyPI. Simply install the package into your project environment with PIP:

pip install flexpasm

Once installed, you can start using the library in your Python projects. Check out the documentation for detailed usage examples and API reference.

Basic Usage

Using templates

from flexpasm.instructions.segments import Label
from flexpasm.mnemonics import JmpMnemonic
from flexpasm.program import ASMProgram
from flexpasm.settings import Settings
from flexpasm.templates import PrintStringTemplate


def main():
    settings = Settings(
        title="Example ASM Program with Templates",
        author="alexeev-prog",
        filename="example_templates.asm",
        mode="32",
    )
    asmprogram = ASMProgram(settings, __name__)

    pst = PrintStringTemplate("Hello, World!")
    pst2 = PrintStringTemplate("Hello, World!", "msg2", "print_string2")
    start_lbl = Label("start")

    start_lbl.add_instruction(
        JmpMnemonic("print_string"), 1, comment="Jump to print strint template"
    )

    asmprogram.add_label(start_lbl)
    asmprogram.add_template(pst)
    asmprogram.add_template(pst2)

    asmprogram.save_code()


if __name__ == "__main__":
    main()
$ fasm example_templates.asm example_templates
$ ./example_templates

Hello, World!

ASM Code:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Author: alexeev-prog                                                                                               ;;
;; Example ASM Program with Templates                                                                                 ;;
;; Program generated by FLEXPASM (github.com/alexeev-pro/flexpasm)                                                    ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

format ELF executable 3;                        ; ELF EXECUTABLE
entry start                                     ; Set Start Entry


;; Segment readable executable in FASM is a directive for defining a section of code with readable and executable attributes.
segment readable executable

start:                                          ; Label start with 1 commands
    JMP print_string                                ; Unconditional jump to label print_string; Jump to print strint template

print_string:                                   ; Label print_string with 7 commands
    MOV EAX, 4                                      ; Loading 4 value into EAX register.
    MOV ECX, msg                                    ; Loading msg value into ECX register.
    MOV EDX, msg_size                               ; Loading msg_size value into EDX register.
    INT 128                                         ; Call software interrupt 128: SYSCALL
    MOV EAX, 1                                      ; Loading 1 value into EAX register.
    MOV EBX, EBX                                    ; Exclusive OR operation EBX and EBX using XOR
    INT 128                                         ; Call software interrupt 128: SYSCALL

print_string2:                                  ; Label print_string2 with 7 commands
    MOV EAX, 4                                      ; Loading 4 value into EAX register.
    MOV ECX, msg2                                   ; Loading msg2 value into ECX register.
    MOV EDX, msg2_size                              ; Loading msg2_size value into EDX register.
    INT 128                                         ; Call software interrupt 128: SYSCALL
    MOV EAX, 1                                      ; Loading 1 value into EAX register.
    MOV EBX, EBX                                    ; Exclusive OR operation EBX and EBX using XOR
    INT 128                                         ; Call software interrupt 128: SYSCALL


;; Segment readable writeable in FASM is a definition of a segment of program data codes, where the attributes readable (the contents of the segment can be read) and writeable (program commands can both read codes and change their values) are specified for it.
segment readable writeable

message db 'Hello, World!', 0xA                 ; Var message (string)
message_size = $-message                        ; Var message (string) length

message db 'Hello, World!', 0xA                 ; Var message (string)
message_size = $-message                        ; Var message (string) length

Simple

from flexpasm import ASMProgram
from flexpasm.constants import LinuxInterrupts
from flexpasm.instructions.registers import get_registers
from flexpasm.instructions.segments import Label
from flexpasm.mnemonics import IntMnemonic, MovMnemonic, XorMnemonic
from flexpasm.settings import Settings


def main():
    settings = Settings(
        title="Example ASM Program",
        author="alexeev-prog",
        filename="example.asm",
        mode="64",
    )
    asmprogram = ASMProgram(settings, __name__)
    regs = get_registers(settings.mode)

    start_lbl = Label("start")

    start_lbl.add_instruction(MovMnemonic(regs.AX, 4))
    start_lbl.add_instruction(MovMnemonic(regs.CX, "message"))
    start_lbl.add_instruction(MovMnemonic(regs.DX, "message_size"))
    start_lbl.add_instruction(IntMnemonic(LinuxInterrupts.SYSCALL))
    start_lbl.add_instruction(MovMnemonic(regs.AX, 1))
    start_lbl.add_instruction(XorMnemonic(regs.BX, regs.BX))
    start_lbl.add_instruction(IntMnemonic(LinuxInterrupts.SYSCALL))

    asmprogram.add_label(start_lbl)
    asmprogram.main_rws.add_string("message", "Hello, World!")

    asmprogram.save_code()
    # asmprogram.restore_backup()


if __name__ == "__main__":
    main()
$ fasm example.asm example
$ ./example

Hello, World!

Generated ASM code:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Author: alexeev-prog                                                                                               ;;
;; Example ASM Program                                                                                                ;;
;; Program generated by FLEXPASM (github.com/alexeev-pro/flexpasm)                                                    ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

format ELF64 executable 3;                      ; ELF64 EXECUTABLE
entry start                                     ; Set Start Entry


;; Segment readable executable in FASM is a directive for defining a section of code with readable and executable attributes.
segment readable executable

start:                                          ; Label start with 7 commands
    MOV RAX, 4                                      ; Loading 4 value into RAX register.
    MOV RCX, message                                ; Loading message value into RCX register.
    MOV RDX, message_size                           ; Loading message_size value into RDX register.
    INT 128                                         ; Call software interrupt 128: SYSCALL
    MOV RAX, 1                                      ; Loading 1 value into RAX register.
    MOV RBX, RBX                                    ; Exclusive OR operation RBX and RBX using XOR
    INT 128                                         ; Call software interrupt 128: SYSCALL


;; Segment readable writeable in FASM is a definition of a segment of program data codes, where the attributes readable (the contents of the segment can be read) and writeable (program commands can both read codes and change their values) are specified for it.
segment readable writeable

message db 'Hello, World!', 0xA                 ; Var message (string)
message_size = $-message                        ; Var message (string) length

(back to top)

💬 Support

If you encounter any issues or have questions about pyEchoNext, please:

(back to top)

🤝 Contributing

We welcome contributions from the community! If you'd like to help improve pyEchoNext, please check out the contributing guidelines to get started.

(back to top)

Specifications

(back to top)

License

Distributed under the MIT License. See LICENSE for more information.

(back to top)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flexpasm-0.2.1.tar.gz (13.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flexpasm-0.2.1-py3-none-any.whl (16.7 kB view details)

Uploaded Python 3

File details

Details for the file flexpasm-0.2.1.tar.gz.

File metadata

  • Download URL: flexpasm-0.2.1.tar.gz
  • Upload date:
  • Size: 13.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.7 Linux/6.12.0-1-cachyos

File hashes

Hashes for flexpasm-0.2.1.tar.gz
Algorithm Hash digest
SHA256 d7c6d147acecbcc54bd06e488e46ee8a13fbd671243d1d02ded30b3656cd5306
MD5 5cdbeeaee5c67d9edc5bb7b6dbb1b61c
BLAKE2b-256 9c456aa0bdc7dfaf52ec2c63a67d2a614d9fb8e499581d90c92be00b8fcb1411

See more details on using hashes here.

File details

Details for the file flexpasm-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: flexpasm-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 16.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.7 Linux/6.12.0-1-cachyos

File hashes

Hashes for flexpasm-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a70904b8f9c556483b116ea1c06c8d93d332068529892aa00630d0d4bbd2d171
MD5 24dcfa1b8c70cfc410b28de280394431
BLAKE2b-256 27ea4d53b76d78e3dea01195ea0dabd3a1df3be36fbe27ac5d22fa2bf30d60c1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page