Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa | |||
td3:abi64 [2012/08/22 21:55] mdoallo |
— (actual) | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== 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 < | ||
- | |||
- | 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__(" | ||
- | |||
- | ===== 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 ; | ||
- | jmp _start | ||
- | ... | ||
- | _start: | ||
- | ... | ||
- | mov rdi,0xb8000 | ||
- | call LimpiaPantalla_c ; | ||
- | | ||
- | |||
- | ==== En C ==== | ||
- | |||
- | void LimpiaPantalla_c(unsigned char * ptrDobleBuffer) | ||
- | { | ||
- | int i = 0x88; | ||
- | __asm__(" | ||
- | __asm__(" | ||
- | for (i=0; i<25*80; i++) | ||
- | { | ||
- | *ptrDobleBuffer++ = 0x20; | ||
- | *ptrDobleBuffer++ = 0x07; | ||
- | } | ||
- | } | ||
- | |||
- | ===== Consultas o sugerencias ===== | ||
- | |||
- | Por consultas o sugerencias, | ||