2014-06-28 9 views
9

io sono un principiante in assemblea, ma un maestro in Python. Ho appena iniziato a imparare x86_64 NASM per Windows, e desidero combinare la potenza dell'assemblaggio e la flessibilità di Python. Ho dato un'occhiata dappertutto e non ho trovato il modo di utilizzare una procedura di assemblaggio NASM da Python. Con ciò non intendo l'assemblaggio in linea. Desidero scrivere un programma assembly, compilarlo e quindi estrarre in qualche modo la procedura da utilizzare nel mio programma Python. Qualcuno può illustrare un semplice esempio di come farlo, poiché sono completamente perso.Come arrivare Python da usare all'Assemblea

+1

possibile duplicato di [Come scrivere estensioni python in puro asm e sarebbe efficiente?] (Http://stackoverflow.com/questions/14546610/how-to-write-python-extensions-in-pure-asm -e -e-essere-efficiente) – jcaron

risposta

12

Si potrebbe creare un wrapper C extension per le funzioni implementate in assemblea e collegarlo al file OBJ creato da NASM.

Un esempio fittizio (per 32 bit Python 2; non testato):

myfunc.asm:

;http://www.nasm.us/doc/nasmdoc9.html 
global _myfunc 
section .text 
_myfunc: 
    push ebp 
    mov  ebp,esp 
    sub  esp,0x40  ; 64 bytes of local stack space 
    mov  ebx,[ebp+8]  ; first parameter to function 
    ; some more code 
    leave 
    ret 

myext.c:

#include <Python.h> 

void myfunc(void); 

static PyObject* 
py_myfunc(PyObject* self, PyObject* args) 
{ 
    if (!PyArg_ParseTuple(args, "")) 
     return NULL; 
    myfunc(); 
    Py_RETURN_NONE; 
} 

static PyMethodDef MyMethods[] = 
{ 
    {"myfunc", py_myfunc, METH_VARARGS, NULL}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC initmyext(void) 
{ 
    (void) Py_InitModule("myext", MyMethods); 
} 

configurazione .py:

from distutils.core import setup, Extension 
setup(name='myext', ext_modules=[ 
    Extension('myext', ['myext.c'], extra_objects=['myfunc.obj'])]) 

costruire e gestire:

nasm -fwin32 myfunc.asm

python setup.py build_ext --inplace

python -c"import myext;myext.myfunc()"

2

Non è sicuro circa il "potere" di assemblaggio, davvero.

si può iniziare qui: https://docs.python.org/2/extending/extending.html

Si tratta di estendere pitone con codice compilato, scritto in C o C++, ma il principio dovrebbe essere lo stesso (C è in realtà solo una macro-assembler portatile).

+0

Ho letto molti documenti su come estendere Python, ma non riesco a capirlo, quindi la domanda. Se potessi averlo capito da una pagina di documentazione di Python, lo avrei fatto. Inviare una risposta indirizzandomi a qualcosa che non riconosce nemmeno la domanda (NASM/Assemblea/'illustrare come') non è una risposta. Scusate.Il minimo che avresti potuto fare era mostrare come avresti potuto usare C come assemblatore per il mio caso. –

+0

C genera un assembly che viene poi compilato (sebbene al giorno d'oggi questo sia ben nascosto). I formati degli oggetti, i simboli e tutto il resto sono comuni a entrambi. Puoi persino assemblare in linea nel codice C. Quindi se comprendi le convenzioni usate per l'integrazione del codice C in python, allora sono esattamente le stesse per l'assembly. – jcaron

+0

L'argomento è già stato affrontato qui: http://stackoverflow.com/questions/14546610/how-to-write-python-extensions-in-pure-asm-and-would-it-be-efficient – jcaron

7

È anche possibile incorporare il montaggio direttamente all'interno del vostro programma Python:

Questi lavori compilando il montaggio e caricato nella memoria eseguibile in fase di esecuzione. I primi tre progetti implementano gli assemblatori x86 in Python, mentre l'ultimo richiama un compilatore esterno.