Djgpp Inline Assembler (Traducido por Edmundo López)
Este documento fue escrito originalmente por Jerome St-Louis, la versión original en ingles puede ser encontrada en http://pages.infinit.net/jstlouis/djgpp/djgpp_inline_asm.html
Este tutorial asume que ya conoces la sintaxis clásica de Intel. DJDPP usa el ensamblador entre lineas de AT&T,
que se diferencia mucho de la syntaxis de Intel. Lo principal a tener en cuenta
es lo siguiente:
- La sintaxis general es:
asm("instrucciones");
- El orden Destino, Fuente es
ahora Fuente, Destino.
- Debes poner un % delante del nombre de
los registros.
- Delante de las constantes debe ponerse
un $.
- Los números hexadecimales usan
sintaxis de C (0x13 en vez de 13h).
- Debes aumentar un sufijo de le un
sufijo de una letra a cada instrucción para especificar el tipo de datos (b
para byte, w para word (palabra), l para long).
- asm mov ax, 13h;(en
sintaxis de Intel) se hace asm("movw $0x13, %ax");
- Cuando se usa instrucciones asm
con varias lineas, debes aumentar \n\t al final de cada linea, para
que DJGPP aumente un retorno de carro/alimentación de linea al código .S
(ensamblador) resultante.
- Nunca olvides hacer push y
pop a cada registro que modifiques
- Para usar variables de C, necesitas la sintaxis extendida de ensamblador
entre lineas: asm ("Instrucciones":["g="(Campos
de Salida)]:["g"(Campos de Entrada)]:["Campo Golpeado
1", ...]);.
- Los campos son representads por %0 a
%9. Cuando se usan ambos campos de entrada y salida, la salida va usar los
los primeros números, y la entrada va a continuar la secuencia.
- Cuando se usa la sintaxis extendida
del ensablador entrelineas, necesitaras poner dos "%" antes
de los nombres de los registros.
- Ejm: Para poner modo en ax
: asm("movw %0,%%ax"::"g"(modo));.
- Cuando especificas un registro
(siempre uno de 16 byte, ax, se preocupara por ambos ax
y eax) en el campo golpeado, no necesitaspreocuparte por pushearlos
y popearlos. También necesitas especificar memoria cunado usas
cualquiera de los otros campos.
Mira estos ejemplos para hacertelo más fácil
Aumentando do enteros largos(long int) usando Ensablador entrelineas
extendido.-
#include <stdio.h>
#include <conio.h>
void main()
{
long int Num1=4281093, Num2=100000, Sum;
asm("movl %1, %%eax\n\t"
"movl %2, %%ebx\n\t"
"addl %%ebx, %%eax\n\t"
"movl %%eax, %0"
: "g="(Sum)
: "g"(Num1), "g" (Num2)
: "ax", "bx", "memory");
printf("%li+%li=%li\n",Num1,Num2,Sum);
while(!kbhit());
getch();
}
Copyright © 1996-1998 Jerome St-Louis
jerstlouis@videotron.ca