www.delorie.com/djgpp/doc/ug/asm/inline.html   search  
Ensamblador en línea con DJGPP

Esta sección fué escrita por Marc Brooker

Esto no es un tutorial de ensamblador, es para aquel que ya puede escribir algo de ensamblador y desea aprender a escribir ensamblador "en línea" en DJGPP.

¿Para qué podría querer ensamblar en línea?

Hay una variedad de razones por las que usted podría optar por incluir código ensamblaodr en su programa. El compilador de djgpp produce codigo de gran calidad, pero so siempre es lo más rápido/pequeño que podría obtener con el. Algunas veces, usted querría escribir su propio código en ensamblador para alcanzar su objetivo. Esto es más importante en ciclos internos que necesitan ser ejecutados más de 10 veces por segundo. Si usted tiene código que es ejecutado una sola vez, entonces su código podría no dar mucho impácto a la velocidad de su programa.

¿Para qué no debería ensamblar en línea?

Tambien puede hacer peor las cosas añadiendo código ensamblador en línea. Si el código que GCC habría creado o el código de la librería que usted está remplazando es más rápido, usted podría hacer más lento a su programa. Amenudo el código ensamblador que usted escribe no es tan estable como el código de DJGPP, pero usted puede contrarestar ésto escribiendo código más estable =). Mucha gente tiende a hacer sacrificios en velocidad/estabilidad, EMHO esto es estúpido si se lleva demasiado lejos.

Usando el Ensamblador en Línea.

Hay algunas cosas que anotar cuando se usa el ensamblador en DJGPP, primeramente, DJGPP usa el formato AT&T, no el formato Intel al que mucha gente está acostumbrada. En el formato AT&T los operandos se invierten. Si usted usa un registro como operando, debe antecederlo con un % y valores inmediatos obtienen un $. Usted tambien tendrá que añadir un sufijo a las instrucciones para especificar el tamaño de los operandos.

movl %ecx, %ebx

Note la 'l' al final del mov. Esto especifica que la instrucción está trabajando en operandos de 32 bits. 'w' indica que la instrucción está usando operandos de 16 bits y 'b' para de 8 bits.

Así que con todo eso en mente, ¿Cómo puede en realidad añadirl a su código? Usted debe usar la palabra clave asm. Ésta toma la siguiente forma:

asm("instructions" : outputs : inputs : clobber list);

En realidad, aquí no necesitamos usar los últimos tres, pero para código más largo si lo necesitará. Veamos que hacen.

asm ("
	pushl %%eax
	movl %1, %%eax
	movl %2, %%ebx
	addl %%ebx, %%eax
	movl %%eax, %0
	popl %%eax"
	: "=g" (i)
	: "g" (j), "g" (k)
	: "bx" );

Vaya. Vamos a travez de ese trozo de código paso por paso. El códig en realidad, como ya usted debe haberse imaginado, añade j y k y pone el resultado en ii. Primeramente, ¿Qué hay con los '%%'? Si usted tiene entradas o salidas, entonces debe poner %% antes de los nombres de los registros. Luego con la lista de entradas. ¿Quién es 'g'? G simplemente le dice al compilador que ponga el argumento en cualquier lugar. Luego usted puede referenciarlo en orden, %0 es i, %1 es j y %2 es k. '=g' le dice al compilador que es la salida. Ponemos ebx en la lista de clobbered para que sea clobbered(*).

Hemos visto nuestro primer ejemplo y hemos aprendido mucho en las últimas líneas. Vaya y consígase una taza de café fuerte(o mass si usted no bebe café:-) y siga leyendo. Ahora, ¿Qué hay con 'jmp' y sus amigos?. Usted puede usarlos, pero debe continuar sus etiquetas con b para atras y f para adelante. La siguiente pieza de código le ilustrará esto.

asm ("0:
	//algunas cosas
	jmp 0b
	//mas cosas
	jmp 1f
      1:" );

Ya está todo dicho y ehco, pero ¿Qué hay acerca de las referencias a la memoria, tambien son diferentes? Si, como todo, tambien son diferentes, por ejemplo, si usted quiere accesar ebp + 4 usted usaría la línea movl4(%ebp), %eax. Alcanzo a oir a la gente diciendo ¡Vaya, eso es extraño!. Dependiendo de lo que usted haga en ensamblador podría no tener que usar nunca esta sintáxis, su forma completa es desp(base, indice, escala).

Esto deberia ponerlo en el camino de portar esa aplicación que usa ensamblador en línea desde un sistema diferente. Me disculpo por cualquier problema con esto ya que lo escribí una noche cerca de las 11:30 para un amigo que estaba comenzando en DJGPP.


traducido por ADnoctum

NT: ¿Qué es clobbered y mass? no las encuentro en ningun diccionario. Si sabe qué son, por favor escríbame a adnoctum@eudoramail.com


  webmaster   donations   bookstore     delorie software   privacy  
  Copyright © 1999   by DJ Delorie     Updated Apr 1999  

Please take a moment to fill out this visitor survey

You can help support this site by visiting the advertisers that sponsor it! (only once each, though)