Consideraciones para integrar C y Assembler en IA-32e

En el archivo ASM

  • Declaración EXTERN en ASM
  • No hace falta la directiva ORG en el ASM
  • Se compila con:
nasm -f elf64 $(KERNEL_SRC) -o $(KERNEL_OBJ)

En el Archivo C

  • Se compila con:
gcc -nostdinc -m64 -c -o $(FUNCION_C_OBJ) $(FUNCION_C_SRC)

Juntando todo

Ambas compilaciones generan archivos objetos (.o).

Usar luego el linker y se debe especificar el inicio (que la directiva ORG ausente en el código ASM), esto se hace con -Ttext <dirección física>, típicamente 0x8000:

sudo ld -m elf_x86_64 --oformat binary -b elf64-x86-64 -Ttext 0x8000 $(KERNEL_OBJ) $(FUNCION_C_OBJ) -o $(KERNEL_BIN)

Break point en C

Se puede apelar al magic break point del bochs aún en lenguaje C, para eso:

__asm__("xchg %bx,%bx");

Ejemplo de pasaje de argumento

A continuación un ejemplo de pasaje de un puntero de ASM a una función en C.

En ASM

global _start

EXTERN	LimpiaPantalla_c
...
[bits 16]
;	org 8000h       ;Direccion donde carga el bootloader este programa ahora va como argumento en la instrucción ld.
jmp _start
...
_start:
...
mov rdi,0xb8000
call LimpiaPantalla_c	; funcion implementada en C

En C

void LimpiaPantalla_c(unsigned char * ptrDobleBuffer)
{
  int i = 0x88;
  __asm__("xchg %bx,%bx");
  __asm__("nop");
  for (i=0; i<25*80; i++)
  {
    *ptrDobleBuffer++ = 0x20;
    *ptrDobleBuffer++ = 0x07;
  }
}

Consultas o sugerencias

Por consultas o sugerencias, enviar correo electrónico a Marcelo Doallo