Найти тему

Программирование на языке Python. Библиотека ctypes и ассемблер. Статья для гурманов

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Базовый курс программирования на Python | programmer's notes (python and more) | Дзен

Используем ассемблер в программах на Python и библиотека ctypes.

Да я старый ассемблерщик, что тут скрывать. Пишу на разных ассемблерах уже много-много лет. И сегодня приведу пример для гурманов. Мы соединим программу на ассемблере с программой на Python. А что не так? Попытка не пытка, как говаривал один исторический персонаж.

На самом деле ограничим себя только одной задачей: попробуем вызвать динамическую библиотеку и программы на языке python. Динамическую же библиотеку напишем на ассемблере. В Linux,правда, такие библиотеки называют разделяемыми (shared library). А мы работаем в Linux.

Вот пример такой библиотеки.

# модуль с внешней функцией.
.text
.globl pow # публичное имя функции
pow: # rdi  входной параметр
# сохраним, используемые в функции регистры.
push %rdi
mov  %rdi, %rax
mul  %rdi # возведём в квадрат, результат в rax
# восстанавливаем структуру стека
pop %rdi
ret

В библиотеке есть только одна функция с именем pow. Она получает целое число через регистр rdi и возвращает его квадрат через регистр rax.

Пусть программа называется as1.s. Откомпилировать данный текст и получим динамическую библиотеку (с расширением .so). Для этого нужны две команды

as --64 as1.s -o as1.o
ld -shared as1.o -o mylib.so

В результате получим библиотеку mylib.so.

Создадим в том же каталоги программу на языке Python.

#!/usr/bin/python3
import ctypes
n = int(input()) # получить целое число
# загрузка динамическую библиотеку
libc = ctypes.CDLL("./mylib.so")
# вызов функции из библиотеки.
cn = libc.pow(n)
print(cn)

Всё готово! Запускайте программу и получайте квадраты целых чисел.

Кстати, заметим следующее. Библиотека ctypes позволяет создавать обёртки для существующих у вас динамических библиотек. Полезная вещица. Напишите, нужны ли ещё статьи по данной тематике.

Ну, пока всё!

Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.

Писать нужно на ассемблере и в командной строке
Писать нужно на ассемблере и в командной строке

Наука
7 млн интересуются