====== 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 **, 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 //[[mdoallo@electron.frba.utn.edu.ar|Marcelo Doallo]] //