Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

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