2009-08-15 72 views

Respuesta

26

Cuando escribe en ensamblador, , está describiendo con precisión las instrucciones para generar, por lo que no depende del ensamblador. Depende de ti. Hay una correspondencia uno a uno entre los mnemónicos que escribe y las instrucciones reales en el código máquina.

+13

Técnicamente eso no es del todo cierto; para cosas como modos de direccionamiento, puede haber más de una forma de codificar la misma ubicación. Hay otros isomorfismos que he olvidado; un ensamblador shareware x86 de la parte de atrás usó estos isomorfismos para codificar la "huella dactilar" ensamblada con ella, con el objetivo de atrapar trucos. –

+1

Entiendo lo que dices. Puede haber diferentes instrucciones de código de máquina con un efecto similar. Técnicamente, un ensamblador puede proporcionar dos representaciones diferentes para esas instrucciones ('int3' y' int 3') o usar algunas sugerencias para elegir cuál generar. Estas cosas generalmente están documentadas para cada ensamblador. Supongo que para el propósito de esta pregunta, es razonable ignorar estos problemas ya que teóricamente, ** son instrucciones realmente diferentes ** y el ensamblador podría permitirle elegir entre uno. –

+4

Incluso en ensamblador hay algo de espacio para optimizar. Muchas arquitecturas permiten modos cortos para la dirección, por ejemplo, utilizando un valor de byte para el desplazamiento relativo en lugar de un largo. Dado que estas optimizaciones cambian el tamaño del código del objeto, algunos desplazamientos pueden usarse en forma abreviada, por lo que se requiere una optimización de múltiples pasos. AFAIK yasm puede hacer esto. – hirschhornsalz

4

Es assember ... no optimiza el código. Simplemente se traduce como es. Por lo tanto, el código más rápido y limpio es producido por el programador o compilador

+1

Ok, lo tengo! Ahora, el ensamblador es también un compilador, ¿verdad? ¿Podría ahorrar un ciclo de CPU aquí y allá? esa era mi duda ... –

+1

ensamblador no es un compilador. Un compilador generalmente se basa en un ensamblador. Y el ensamblador traduce el ensamblaje en código de operación binario. – tsturzl

2

Obviamente nasm porque la sintaxis de Intel parece mucho más limpia que AT & T sintaxis.

+0

Sí, el "aspecto" limpio también cuenta como un plus, creo. –

+4

Honestamente prefiero la sintaxis de AT & T. Creo que transfiere la intención del código más claro y se ve menos desordenado. Lástima que haya tan poca documentación allí. – kmm

+4

+1 Para recomendar la sintaxis de Intel sobre AT & T. Los amigos no permiten que los amigos usen AT & T. – Jason

1

@ Brian: que no era la pregunta ...

@ cyber98834: Bueno, un ensamblador hace lo que debe hacer cada ensamblador: traducir cada instrucción a su código de operación.

No hay optimización.

Ah, y también, no existe el "código más rápido" ... ¿Puedo hacerte una pregunta? La velocidad de la CPU es estática, ¿no?

Por lo tanto, no puede hacer que un código se ejecute más rápido porque no puede cambiar la velocidad de la CPU.

Pero puede reducir el código para que la CPU maneje menos cantidad de instrucciones y, por lo tanto, le toma menos tiempo ejecutarlo.

Espero que entiendas lo que estoy tratando de decir.

Le sugiero que compre (o que busque algunos pdf, pero no sé si eso es legal) Libro negro de programación de gráficos de Michael Abrash que cubre muchas lecciones de optimización.

+0

Hola SBouazza! Entiendo tu punto. ¡Gracias! Ya tengo preparado el Libro negro de programación de gráficos de Michael Abrash (http://www.gamedev.net/reference/articles/article1698.asp) para más tarde :) –

7

No sé acerca de estas dos herramientas específicas, pero hay algunas instrucciones que pueden ser codificados de manera diferente:

  • ADD AX,1 es bien 05 01 o 81 c0 01 o fe c0
  • INT 3 es o bien cc o cd 03
  • Las nuevas instrucciones AVX que extienden las instrucciones SSE de dos bytes tendrán un prefijo de 2 o 3 bytes. Todos los prefijos de 2 bytes se pueden codificar también como prefijos de 3 bytes.

Estos son solo algunos ejemplos de cómo los ensambladores pueden codificar la misma instrucción de manera diferente, por lo que la pregunta tiene sentido.

+0

La mayoría de los ensambladores suelen elegir las instrucciones con un tamaño mínimo y puede proporcionar sugerencias para que pueda elegir específicamente cuál desea generar. Por ejemplo, 'cc' y' cd 03' son dos instrucciones distintas desde la perspectiva de la CPU. Es completamente en nombre del ensamblador elegir no proporcionar una forma de generar una instrucción. –

+0

Acepto que un buen ensamblador * debería * hacer eso. Solo estoy señalando formas en que un ensamblador puede hacer algo diferente. Por ejemplo, 'INC AX' codificado como' fe c0' es exactamente lo mismo que 'ADD AX, 1' codificado como' 05 01' en lo que respecta a la funcionalidad y la longitud de la instrucción, aunque se decodifican por separado en la CPU. –

+0

Eso es lo que realmente estaba buscando con mi pregunta. Estoy empezando a aprender ensamblaje x86 (he leído el manual de Intel) y quiero usar herramientas Linux para eso, pero tenía dudas sobre con qué herramienta comenzar. Dado que parece que no existe una diferencia real entre gas y nasm, recogeré nasm debido al sintaxis más amigable. ¡Gracias por la ayuda! –

5

Como nota al margen sobre la sintaxis de la materia. Usted puede tener el trabajo GAS perfectamente bien con la sintaxis de Intel, poniendo la siguiente línea en la parte superior de su archivo fuente:

.intel_syntax noprefix 

estoy usando la sintaxis de Intel también para todas mis necesidades assmebly. Parece mucho más natural que la sintaxis de AT & T. Y ahorra algunas pulsaciones de teclas :-).

+0

_Recent_ Gas. Si está en OS/2 puede que no tenga suerte :) –

Cuestiones relacionadas