社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何在python中使用程序集[duplicate]

Asm Programmer • 5 年前 • 1864 次点击  

我想在python脚本中执行汇编代码。有可能吗?

在C语言中,编程如下

static inline getesp(){
        __asm__("mov %esp, %eax");
}

但是如何使用Python呢?有可能吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53804
 
1864 次点击  
文章 [ 7 ]  |  最新文章 5 年前
TomFoolery
Reply   •   1 楼
TomFoolery    8 年前

很有可能我用python做了一个小的汇编程序,我使用的一些库可能支持Ctypes,但我使用的是纯python,大多数语言实际上都是在低级别上进行接口的,我们只是使用HLL语言特性,没有适当注意代码是如何处理的,我还用visual basic编写了一个使用ASM x86代码的小型POC图像编辑应用程序 我真的不知道如何把它编辑成我想说的话。除了可能从脚本本身读取asm代码和工作的函数之外。我相信我的想法被指出是错误的。ASM代码可以通过使用脚本函数来执行,这些函数读取并编译代码的该区域。几乎就像是一个内置的实时汇编程序。我试着帮助一个不那么伟大的演讲者,虽然(或者在这种情况下,可能是写作)这一页也许能更好地解释我想说的话 http://code.activestate.com/recipes/579037-how-to-execute-x86-64-bit-assembly-code-directly-f/

detly
Reply   •   2 楼
detly    14 年前

理论上,你可以:

  1. 用C编写一个调用程序集的简单函数
  2. 使用 Cython Pyrex 从Python调用该函数

bradley.ayers
Reply   •   3 楼
bradley.ayers    14 年前

user7610
Reply   •   4 楼
user7610    6 年前

作为一个具体的例子,下面是如何调用一个函数,该函数将获取一个int并返回递增的一。

要获取设置了可执行标志的内存, mmap 使用模块。

要调用函数, ctypes 使用模块。

要将机器代码放入内存,有硬编码字节字符串。

代码将打印43。

import ctypes
import mmap

buf = mmap.mmap(-1, mmap.PAGESIZE, prot=mmap.PROT_READ | mmap.PROT_WRITE | mmap.PROT_EXEC)

ftype = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)
fpointer = ctypes.c_void_p.from_buffer(buf)

f = ftype(ctypes.addressof(fpointer))

buf.write(
    b'\x8b\xc7'  # mov eax, edi
    b'\x83\xc0\x01'  # add eax, 1
    b'\xc3'  # ret
)

r = f(42)
print(r)

del fpointer
buf.close()
Крайст
Reply   •   5 楼
Крайст    12 年前

很抱歉死尸发布,但我认为您可以使用asm编写自己的DLL,并从Python中调用它的函数。

jkp
Reply   •   7 楼
jkp    14 年前

一种方法是为Python编写(C)扩展。你可以看看 this

开发基于C的Python扩展的另一种方法是使用 ctypes 模块。