Py学习  »  Python

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

Asm Programmer • 5 年前 • 1866 次点击  

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

在C语言中,编程如下

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53804
 
1866 次点击  
文章 [ 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 模块。