COMO APROBAR EL
TP-0 SIN MORIR
EN EL INTENTO

Patricio Palladino

 

NUNCA EMPEZAR
POR EL ASSEMBLER

RECETA PARA APROBAR


  1. Implementación trivial en C
  2. Agregar tests
  3. Correr los tests con valgrind
  4. Si hay errores corregir y volver al paso 3
  5. Elegir la funcion mas facil
  6. Programarla en asembler
  7. Comentar la funcion en C
  8. Linkearlos juntos
  9. Correr los tests con valgrind
  10. Si hay errores corregir y volver al paso 8
  11. Entregar

ArboL BINARIO DE BUSQUEDA EN C

typedef struct abb {
    int valor;
    struct abb *izq;
    struct abb *der;
} __attribute__((packed)) abb;

__attribute__((packed)): Le dice al compilador que no intente acomodar el struct de una forma inteligente, y ponga un dato pegado al otro.

EJERCICIO

Implementar un arbol binario de busqueda en assembler con las funciones:

/* Crea un ABB con un elemento */
abb *crearABB(int elemento);

/* Elimina un ABB liberando toda la memoria que usa. */
void eliminarAbb(abb *arbol);

/* Retorna true si el elemento esta en el abb */
bool buscarElemento(abb *arbol, int elemento);

/* Agrega un elemento al abb. Retorna true si lo pudo agregar, false sino */
bool agregarElemento(abb *arbol, int elemento);

MESCLANDO C y ASM


  1. Crear un archivo abb.h con las declaraciones
  2. Crear un archivo abb.c con el código C
  3. Crear un archivo abb.s con el código en ASM
  4. Crear un archivo tests.c con lost tests y un main
  5. Compilar el archivo de abb.c en abb.o:
    gcc -c abb.c -o abb.c.o -Wall -Wextra --std=c99 -O0 -g
  6. Compilar el archivo abb.s en abb.asm.o:
    gcc -c abb.c -o abb.c.o -Wall -Wextra --std=c99 -O0 -g
  7. Compilar el archivo tests.c en tests.o:
    gcc -c tests.c -o tests.o -Wall -Wextra --std=c99 -O0 -g
  8. Linkear:
    gcc abb.c.o abb.s.o tests.o -o tests

CALLING CONVENTION

  • Mantener los valores de rbp, rbx y de r12 a r15
  • Mantener el stack alineado a 16 bytes (8 antes del call!)
  • Pasar parametros de izquierda a derecha
  • Los se pasan en enteros en rdi, rsi, rdx, rcx, r8 y r9
  • Los se pasan flotantes en xmm0 a xmm8
  • El resto y los que no entraron en el stack
Esto es un resumen, más en:
http://www.x86-64.org/documentation/abi.pdf

ESQUEMA DE UNA FUNCION

; armamos el stack frame (deja el stack alineado a 16 bytes :)
push rbp
mov rbp, rsp
push rbx
push r12
push r13
push r14
push r15

; codigo

; desarmamos el stack frame
pop r15
pop r14
pop r13
pop r12
pop rbx
pop rbp
ret

prueba

By Patricio Palladino

prueba

  • 820