Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Используем ассемблер в программах на 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 позволяет создавать обёртки для существующих у вас динамических библиотек. Полезная вещица. Напишите, нужны ли ещё статьи по данной тематике.
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.