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, | ||