Pregunta

He leído en muchos lugares que el lenguaje ensamblador generalmente no se usa para crear programas completos, pero otros programas lo usan para hacer que ciertos procedimientos sean más eficientes, particularmente los que se llaman un par de miles de veces por segundo. Me pregunto cómo se incorporan pequeños fragmentos de código de ensamblaje en programas más grandes.

  • Pensé que se podía hacer un pequeño ejecutable y luego ejecutarlo desde otro programa, pero eso parece ineficiente.

  • Luego pensé en el ensamblaje en línea para Visual Studio, pero eso es específico de Microsoft, y parece que habría una mejor manera.

Entonces, ¿cómo pueden usarse pequeños fragmentos de código de ensamblaje dentro de un programa más grande sin crear programas separados o usar el ensamblaje en línea de Visual Studio?

¿Fue útil?

Solución

Aquí hay un ejemplo (GCC):

__asm__ ("movl %eax, %ebx\n\t"
"movl $56, %esi\n\t"
"movl %ecx, $label(%edx,%ebx,$4)\n\t"
"movb %ah, (%ebx)");

Para Microsoft Inline Assembly, la palabra clave es __asm, el código de ensamblaje está envuelto en llaves, no es una cadena y el registro de destino está ahora a la izquierda.

Ejemplo de Microsoft:

int foo(void) {
  __asm{
   mov eax,100 ; Moves 100 into eax!
   leave
   ret
  };
}

Enlaces para más información

Instrucciones y referencia de montaje en línea: http: // www .ibiblio.org / gferg / ldp / GCC-Inline-Assembly-HOWTO.html

Tutorial de IBM, específico para x86: http: // www. ibm.com/developerworks/linux/library/l-ia.html

Otros consejos

El ensamblaje en línea no es específico de Visual Studio: GCC también lo admite. El ensamblaje en línea suele ser la forma más fácil de incorporar el ensamblaje en un programa. Sin embargo, hay un par de problemas: puede afectar en gran medida la portabilidad de su código y algunos compiladores no lo admiten; por ejemplo, el compilador x64 de Microsoft no lo admite.

Para compiladores que no admiten ensamblaje en línea o cuando desea contener todo el código específico de la máquina, generalmente separa las porciones específicas del lenguaje ensamblador en sus propios archivos, exponiendo el código ensamblador como funciones que puede invocar su código C ++. Luego los ensamblas y los vinculas como parte de la compilación. A su enlazador no le importa qué idioma se utilizó para generar los archivos de objetos: puede ensamblar archivos de objetos de varios idiomas en un solo programa.

  

Luego pensé en el ensamblaje en línea para Visual Studio, pero eso es específico de Microsoft, y parece que habría una mejor manera.

Cada compilador admite alguna forma de ensamblaje en línea, aunque generalmente de formas ligeramente diferentes.

Entonces, si necesita usar el ensamblaje en línea, encapsule cada fragmento en una pequeña función. Luego puede volver a implementar estas funciones sin mucho esfuerzo al portar a otro compilador.

Para pequeños fragmentos de código, como los bucles internos, generalmente se realizaría con ensamblaje en línea. ¡Y eso definitivamente no es específico de Microsoft! (GCC y casi todos los compiladores modernos también lo admiten, aunque con diferentes variaciones en la sintaxis).

Para fragmentos de código más grandes (por ejemplo, un gestor de arranque para un sistema operativo), generalmente se colocará en un archivo fuente separado (al igual que se usan varios archivos fuente con cada idioma) y luego se vinculará con el resto del programa usando el enlazador.

Tenga en cuenta que el ensamblaje se usa principalmente para sistemas operativos hoy en día, porque los compiladores ahora son lo suficientemente buenos como para que no sirva de mucho usarlo para bucles internos en cosas como juegos (y no es del todo portátil para diferentes arquitecturas ) Se utiliza principalmente para nivel realmente bajo , como interrupciones de hardware y configuración de paginación (memoria virtual).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top