[ Foro de C++ ]

codigo maquina

10-Jun-2013 14:01
Invitado (Javier)
1 Respuestas

Quisiera saber si es 100% operativo y no me refiero a
si es aconsejable, utilizar bytes y ejecutarlos como
si de una función se tratara y expongo:

Uint8 code [N]={
0x60,                     //    0: pushad
0xBF,0x00,0x00,0x00,0x00, //    3: mov edi,video_mem (4)
0xBE,0x00,0x00,0x00,0x00, //    8: mov esi,virtual (9)
0xB9,0x00,0xB0,0x04,0x00, //    D: mov ecx, size (14)
0xC1,0xE9,0x04,           //   12: shr ecx,4
                         //   15: l1:
0xF3,0x0F,0x6F,0x06,      //   15: movdqu xmm0,[esi]
0xF3,0x0F,0x7F,0x07,      //   19: movdqu [edi],xmm0
0x83,0xC6,0x10,           //   1D: add esi,16
0x83,0xC7,0x10,           //   20: add edi,16
0x49,                     //   23: dec ecx
0x75,0xEF,                //   24: jnz l1
0x61,                     //   26: popad
0xC3};                    //   27: ret

char* adr = static_cast<char*>(malloc(N));
char* b = reinterpret_cast<char*>(&code);

std::copy(b, b + N, adr);

((void(*)())adr)();

...
Espero que podais resolver mi duda, ya que a veces
he obtenido fallos, más no sé si es por el código
o por que el sistema operativo a evitado la ejecución.
Muchas gracias ...


12-Jun-2013 16:31
Nacho Cabanes (+84)

Operativo, en el sentido de que se pueda hacer, sí lo es.

Pero hay varios problemas a la hora de incluir ensamblador (o incluso código máquina en tu caso) dentro de un fuente en C o C++:

- Menos legibilidad (y lo que conlleva, de facilidad de errores y dificultad para corregirlos).

- Falta de portabilidad: lo que hagas ya no se podrá llevar a otro tipo de procesador, y en la mayoría de los casos tampoco a otros sistemas operativos distintos, y en ocasiones ni siquiera a compiladores distintos (aun usando el mismo sistema operativo y el mismo procesador), porque quizá no reconozca esa sintaxis de ensamblador o esa forma de crear una función a partir de un bloque de bytes.

- Habitualmente seguirás atado de manos en cuanto a lo que puedes hacer o lo que no. Por ejemplo, tu fuente parece querer acceder a memoria de video, y el acceso directo a zonas exactas de la memoria es algo que casi cualquier sistema operativo moderno te va a bloquear.

En tu caso, se puede tratar de algún fallo en la lógica del código o bien (más probable) de que el sistema te bloquee el acceso a posiciones concretas de memoria, pero es difícil saber más, porque parece código máquina de un X86 de 32 bits, pero no dices qué sistema operativo usas ni qué compilador.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)