Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
td3:abi64 [2012/08/20 17:12] 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 ==== | ||
| - | |||
| - | EXTERN LimpiaPantalla_c | ||
| - | ... | ||
| - | 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; | ||
| - | } | ||
| - | } | ||