2011-05-18 21 views
12

Quiero ejecutar el código ensamblador dentro de un script python. ¿Es eso posible?Ejecutando código ensamblador con python

En programación C sería así

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

Pero cómo hacerlo con Python? ¿Es posible?

+1

Con su ejemplo, solo obtendrá la pila puntero del intérprete, que no tiene sentido en el contexto de su programa. Entonces, lo que querías hacer no funcionaría, de todos modos. – hirschhornsalz

+2

no es asm solo un pequeño ejemplo que se ejecuta dentro de otro idioma. No me refiero en realidad a que quiera obtener la dirección del puntero de la pila ... –

+0

Esa función no funciona como una función en línea. Realmente necesitas '__tribuir __ ((noinline))' en él o algo así. De lo contrario, simplemente insertará un 'mov% esp,% eax' en cualquier lugar en el que esté en línea, donde el compilador podría estar usando EAX para otra cosa. Deberías usar 'asm (" mov% esp,% 0 ":" = rm "(retval));'. Además, depende del tipo de retorno implícito C89 (de 'int') en la declaración. Además, obtener ESP es un ejemplo realmente malo para algo que usar de Python. Tal vez mostrar usando una instrucción BMI2 como 'pext'? –

Respuesta

11

Una forma de hacerlo podría ser escribir una extensión (C) para Python. Puede consultar la documentación this para obtener detalles completos sobre cómo hacerlo.

Otra forma de desarrollar extensiones de Python basadas en C sería interactuar directamente con una biblioteca externa utilizando el módulo ctypes.

En cualquier caso, necesitaría algún código C compilado en una biblioteca o una extensión y una forma de llamarlo desde Python. Claramente, para lo que quiere lograr esto probablemente no sea óptimo, pero en realidad no es tanto trabajo exponer algunas funciones.

+5

. Debe señalarse que dado que Python admite extensiones C, puede escribir su extensión Who; e en ensamblador puro siempre que lo codifique para seguir las convenciones de llamadas de C wrt paso de parámetros, devolución de valores, registro de uso, etc. – martineau

-2

Python no es compatible con este tipo de interacción de hardware de bajo nivel.

+0

hmmm ... desafortunadamente ... –

+1

Tiene que salir del código Python * normal, pero Python puede hacer interfaz con hardware de bajo nivel a través de ctypes y/o extensiones C. –

+1

Supongo que estaba mirando esto desde la perspectiva del lenguaje, en lugar de desde una implementación como Cython –

0

En teoría, se podría:

  1. Escribir una simple función en C que llama a la asamblea
  2. Uso Cython o Pyrex a llamar a esa función de Python

Tengo que admitir que No he usado ni Pyrex ni Cython, pero es posible que puedan hacer lo que necesiten sin tener que tomarse la molestia de escribir una extensión C completa.

15

Puede consultar el uso del paquete CorePy, disponible here. Para usarlo en un AMD64 por ejemplo, por la documentación:

# Load the x86_64 instructions and environment 
>>> import corepy.arch.x86_64.isa as x86 
>>> import corepy.arch.x86_64.platform as x86_env 
Platform: linux.spre_linux_x86_64_64 

# Create a simple synthetic program 
>>> code = x86_env.InstructionStream() 
>>> code.add(x86.mov(code.gp_return, rsp)) 

# Execute the synthetic program 
>>> proc = x86_env.Processor() 
>>> result = proc.execute(code, mode='int') 
>>> print result 
<rsp value will be here> 
+0

lo he visto. pero, quiero escribir el ensamblaje como en la programación C interna, –

+3

Entonces quizás tengas más suerte investigando cómo CorePy mismo implementa esto. –

3

Lo siento por necroposting pero creo que usted puede escribir su propia DLL mediante ASM y llamar a funciones es desde dentro de Python.

+0

hmm, buena idea hombre. Gracias. –

+0

Estoy aprendiendo asm ahora y lo pensé mientras pensaba en cómo usar adorable python y ensamblador superheroable. ¿Ya has encontrado las soluciones necesarias para esa idea? ¿Puede ser que pueda compartirlos como respuesta a su propia pregunta? Y gracias por esa importante pregunta :) –

7

Puede incrustar el montaje directamente dentro de su programa de Python:

Estos funcionan mediante la compilación de la asamblea y cargarlo en ejecutable memoria en tiempo de ejecución. Los tres primeros proyectos implementan ensambladores x86-64 o x86 en Python, mientras que el último llama a un compilador externo.

0

Es muy posible que haya creado un ensamblador pequeño en python, algunas de las bibliotecas que utilicé pueden haber sido compatibles con Ctypes, pero utilicé Python puro. La mayoría de los lenguajes interactúan en un nivel bajo. Estamos utilizando el HLL Langage. características y no prestar atención adecuada a cómo se procesa el código, también he escrito una pequeña aplicación de edición de imágenes POC en Visual Basic que utiliza ASM x86 Código No estoy seguro de cómo editar esto en lo que estaba tratando de decir . excepto tal vez funciones que leerían el código asm y funcionarían desde el propio script. Creo que mis pensamientos fueron señalados como incorrectos. El código ASM se puede ejecutar a través del uso de funciones con guiones que leen esa área del código y los compilan. casi como si fuera un ensamblador construido sobre la marcha. Trato de ayudar a un hablante no tan bueno (o escrito en este caso). Esta página aquí puede explicar mejor lo que estoy tratando de decir http://code.activestate.com/recipes/579037-how-to-execute-x86-64-bit-assembly-code-directly-f/

+1

El OP quiere ejecutar el código máquina especificado en asm dentro de un programa python, no escribir un programa python para ensamblar fuente asm en código máquina. –

+0

vaya a codewars.com busque __TomFoolery__ ese soy yo y vea el ensamblador que escribí en Python. Tienes que tener acceso a la funcionalidad de bajo nivel para escribir un assember mi buen señor, así que me gustaría diferir :) – TomFoolery

+0

Punto de ser. usted puede. pero tiene que escribir las funciones, algo inútil, pero se puede hacer – TomFoolery

Cuestiones relacionadas