COMO APROBAR EL
TP-0 SIN MORIR
EN EL INTENTO
Patricio Palladino
NUNCA EMPEZAR
POR EL ASSEMBLER
RECETA PARA APROBAR
- Implementación trivial en C
- Agregar tests
- Correr los tests con valgrind
- Si hay errores corregir y volver al paso 3
- Elegir la funcion mas facil
- Programarla en asembler
- Comentar la funcion en C
- Linkearlos juntos
- Correr los tests con valgrind
- Si hay errores corregir y volver al paso 8
- 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
- Crear un archivo abb.h con las declaraciones
- Crear un archivo abb.c con el código C
- Crear un archivo abb.s con el código en ASM
- Crear un archivo tests.c con lost tests y un main
- Compilar el archivo de abb.c en abb.o:
gcc -c abb.c -o abb.c.o -Wall -Wextra --std=c99 -O0 -g - Compilar el archivo abb.s en abb.asm.o:
gcc -c abb.c -o abb.c.o -Wall -Wextra --std=c99 -O0 -g - Compilar el archivo tests.c en tests.o:
gcc -c tests.c -o tests.o -Wall -Wextra --std=c99 -O0 -g - 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
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