viernes, septiembre 02, 2005

Subrutinas de Ensamblador en C

Bueno, ya se que esto a la mayoría os sonará a chino, y os importará una mierda, pero me la suda que estoy estudiando asm del intel 8086, y si no lo apunto pues se me olvida.

La idea es añadir código ensamblador a un programa en C, usando como compilar de ensamblador turbo ensamblador (TASM) y el clásico Turbo C



// Fichero: factmain.c
#include
extern unsigned long fact (unsigned int n );
 
void main (void)
{
   long i;
   i = fact (10);
   printf ("Factorial de 10 %ld", i);

}
// Fichero: fact.asm
.model small
.code
   public _fact
_fact proc near
   push bp
   mov bp,sp
   mov cx, [bp+4]
   cmp cx,0
   je hecho
   dec cx
   push cx
     call _fact
   pop cx
   cmp ax, 0ffffh
   jne sigue
   cmp dx, 0ffffh
   je overfl
sigue:   inc cx
   push dx
   mul cx
   push dx
   push ax
   mov ax, [bp-2]
   mul cx
   jc overfl
   push ax
   mov ax, [bp -6]
   mov dx, [bp - 4]
   add dx, [bp - 8]
   jnc retorno
overfl:   mov ax, 0ffffh
   mov dx, 0ffffh
   jmp short retorno
hecho:   mov dx, 0
   mov ax, 1
retorno:   mov sp, bp
   pop bp
   ret
_fact endp
   end



  1. Compilar el fichero principal factmain.c.
    d:\turboc\tcc -c -Iinclude -Llib factmain.c
    Esto genera un ficheo objeto: factmain.obj

  2. Compilar el fichero ensamblador fact.asm
    d:\tasm\bin\tasm /ml fact.asm

  3. Enlazarlo todo
    d:\turboc\tlink lib\c0s fact factmain, run,, lib\cs
    y te crea un run.exe