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
risposta
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()"
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).
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. –
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
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
È anche possibile incorporare il montaggio direttamente all'interno del vostro programma Python:
- https://github.com/Maratyszcza/PeachPy
- https://github.com//pycca/pycca
- http://codeflow.org/entries/2009/jul/31/pyasm-python-x86-assembler/
- https://github.com/AmihaiN/pyAsm
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.
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