Commit 1c47e2b9 authored by Rafael Martin Monges Luces's avatar Rafael Martin Monges Luces
Browse files

Entrega parcial

parent d1622584
extern malloc
section .rodata
; Acá se pueden poner todas las máscaras y datos que necesiten para el ejercicio
section .text
; Marca un ejercicio como aún no completado (esto hace que no corran sus tests)
FALSE EQU 0
; Marca un ejercicio como hecho
TRUE EQU 1
; Marca el ejercicio 1A como hecho (`true`) o pendiente (`false`).
;
; Funciones a implementar:
; - es_indice_ordenado
global EJERCICIO_1A_HECHO
EJERCICIO_1A_HECHO: db TRUE ; Cambiar por `TRUE` para correr los tests.
; Marca el ejercicio 1B como hecho (`true`) o pendiente (`false`).
;
; Funciones a implementar:
; - indice_a_inventario
global EJERCICIO_1B_HECHO
EJERCICIO_1B_HECHO: db TRUE ; Cambiar por `TRUE` para correr los tests.
;; La funcion debe verificar si una vista del inventario está correctamente
;; ordenada de acuerdo a un criterio (comparador)
;; bool es_indice_ordenado(item_t** inventario, uint16_t* indice, uint16_t tamanio, comparador_t comparador);
;; Dónde:
;; - `inventario`: Un array de punteros a ítems que representa el inventario a
;; procesar.
;; - `indice`: El arreglo de índices en el inventario que representa la vista.
;; - `tamanio`: El tamaño del inventario (y de la vista).
;; - `comparador`: La función de comparación que a utilizar para verificar el
;; orden.
;;
;; Tenga en consideración:
;; - `tamanio` es un valor de 16 bits. La parte alta del registro en dónde viene
;; como parámetro podría tener basura.
;; - `comparador` es una dirección de memoria a la que se debe saltar (vía `jmp` o
;; `call`) para comenzar la ejecución de la subrutina en cuestión.
;; - Los tamaños de los arrays `inventario` e `indice` son ambos `tamanio`.
;; - `false` es el valor `0` y `true` es todo valor distinto de `0`.
;; - Importa que los ítems estén ordenados según el comparador. No hay necesidad
;; de verificar que el orden sea estable.
global es_indice_ordenado
es_indice_ordenado:
; Te recomendamos llenar una tablita acá con cada parámetro y su
; ubicación según la convención de llamada. Prestá atención a qué
; valores son de 64 bits y qué valores son de 32 bits o 8 bits.
;
; r/m64 = item_t** inventario
; r/m64 = uint16_t* indice
; r/m16 = uint16_t tamanio
; r/m64 = comparador_t comparador
; rdi = inventario (item_t**)
; rsi = indice (uint16_t*)
; rdx = tamanio (uint16_t)
; rcx = comparador (comparador_t)
; bool es_indice_ordenado(item_t** inventario, uint16_t* indice, uint16_t tamanio, comparador_t comparador)
push rbp ; Guardar base pointer
mov rbp, rsp ; Establecer nueva base
push r12 ; Guardar los registros no volatiles
push r13
push r14
push r15
mov r12, rdi ; Mover todo a registros no volatiles
movzx r13, si
movzx r14, dx
mov r15, rcx
dec r14 ; Las comparaciones a hacr son tamanio - 1
.loop:
test r14, r14 ; Test si tamanio es 0
jz .fin_de_comparacion ; Si es 0 fin de comparación
mov rcx, [r13] ; rcx pasa a contener el offset de la lista de indices
mov rdi, [r12+rcx*8] ; Se calcula el objeto y el siguiente
add rcx, 2
mov rsi, [r12+ rcx*8]
call r15 ; Se llama al comparador para ver si estan ordenadas
test rax, rax ; Si el comparador da falso, se termina la comparacion y es falso
jz .fin_de_comparacion
add r13, 2 ; Se suma 2 para pasa al siguiente indice
dec r14 ; Se resta la iteracion que acaba de ocurrir
jmp .loop ; Se reinicia el loop
.fin_de_comparacion:
pop r15
pop r14
pop r13
pop r12
pop rbp
ret
;; Dado un inventario y una vista, crear un nuevo inventario que mantenga el
;; orden descrito por la misma.
;; La memoria a solicitar para el nuevo inventario debe poder ser liberada
;; utilizando `free(ptr)`.
;; item_t** indice_a_inventario(item_t** inventario, uint16_t* indice, uint16_t tamanio);
;; Donde:
;; - `inventario` un array de punteros a ítems que representa el inventario a
;; procesar.
;; - `indice` es el arreglo de índices en el inventario que representa la vista
;; que vamos a usar para reorganizar el inventario.
;; - `tamanio` es el tamaño del inventario.
;;
;; Tenga en consideración:
;; - Tanto los elementos de `inventario` como los del resultado son punteros a
;; `ítems`. Se pide *copiar* estos punteros, **no se deben crear ni clonar
;; ítems**
global indice_a_inventario
indice_a_inventario:
; Te recomendamos llenar una tablita acá con cada parámetro y su
; ubicación según la convención de llamada. Prestá atención a qué
; valores son de 64 bits y qué valores son de 32 bits o 8 bits.
;
; r/m64 = item_t** inventario
; r/m64 = uint16_t* indice
; r/m16 = uint16_t tamanio
; rdi = inventario (item_t**)
; rsi = indice (uint16_t*)
; rdx = tamanio (uint16_t)
push rbp ; Guardar base pointer
mov rbp, rsp ; Establecer nueva base
push r12 ; Guardar los registros no volatiles
push r13
push r14
mov r12, rdi ; Mover todo a registros no volatiles
mov r13, rsi
movzx r14, dx
dec r14
; Calcular el tamaño de la nueva memoria (tamanio * 8) para punteros
shl rdx, 3 ; tamanio * 8 (cada puntero ocupa 8 bytes)
mov rdi, rdx
call malloc ; Llamar a malloc para asignar memoria
; rax ahora apunta a la nueva memoria (nuevo inventario)
push rbx
mov rbx, rax ; Guardar el puntero al nuevo inventario en rbx
.loop:
test r14, r14 ; Si terminaron la iteraciones, terminar
jz .fin
mov rcx, [r13] ; rcx pasa a contener el puntero + offset de la lista de indices
mov rdi, [r12+rcx*8] ; Accedo inventario para copar el puntero del objeto a rdi
mov [rbx], rdi ; Copia el objeto en la direccion de rbx
add r13, 2 ; Incrementa el offset para pasar al proximo indice
add rbx, 8 ; Incrementa el offset para pasar al proximo objeto del inventario
dec r14 ; Decrementa el contador
jmp .loop ; Volver al bucle
.fin:
; Restaurar registros y el stack frame
pop rbx
pop r14
pop r13
pop r12
pop rbp
ret
section .rodata
; Acá se pueden poner todas las máscaras y datos que necesiten para el filtro
ALIGN 16
section .text
; Marca un ejercicio como aún no completado (esto hace que no corran sus tests)
FALSE EQU 0
; Marca un ejercicio como hecho
TRUE EQU 1
; Marca el ejercicio 2A como hecho (`true`) o pendiente (`false`).
;
; Funciones a implementar:
; - ej2a
global EJERCICIO_2A_HECHO
EJERCICIO_2A_HECHO: db FALSE ; Cambiar por `TRUE` para correr los tests.
; Marca el ejercicio 2B como hecho (`true`) o pendiente (`false`).
;
; Funciones a implementar:
; - ej2b
global EJERCICIO_2B_HECHO
EJERCICIO_2B_HECHO: db FALSE ; Cambiar por `TRUE` para correr los tests.
; Marca el ejercicio 2C (opcional) como hecho (`true`) o pendiente (`false`).
;
; Funciones a implementar:
; - ej2c
global EJERCICIO_2C_HECHO
EJERCICIO_2C_HECHO: db FALSE ; Cambiar por `TRUE` para correr los tests.
; Dada una imagen origen ajusta su contraste de acuerdo a la parametrización
; provista.
;
; Parámetros:
; - dst: La imagen destino. Es RGBA (8 bits sin signo por canal).
; - src: La imagen origen. Es RGBA (8 bits sin signo por canal).
; - width: El ancho en píxeles de `dst`, `src` y `mask`.
; - height: El alto en píxeles de `dst`, `src` y `mask`.
; - amount: El nivel de intensidad a aplicar.
global ej2a
ej2a:
; Te recomendamos llenar una tablita acá con cada parámetro y su
; ubicación según la convención de llamada. Prestá atención a qué
; valores son de 64 bits y qué valores son de 32 bits o 8 bits.
;
; r/m64 = rgba_t* dst
; r/m64 = rgba_t* src
; r/m32 = uint32_t width
; r/m32 = uint32_t height
; r/m8 = uint8_t amount
ret
; Dada una imagen origen ajusta su contraste de acuerdo a la parametrización
; provista.
;
; Parámetros:
; - dst: La imagen destino. Es RGBA (8 bits sin signo por canal).
; - src: La imagen origen. Es RGBA (8 bits sin signo por canal).
; - width: El ancho en píxeles de `dst`, `src` y `mask`.
; - height: El alto en píxeles de `dst`, `src` y `mask`.
; - amount: El nivel de intensidad a aplicar.
; - mask: Una máscara que regula por cada píxel si el filtro debe o no ser
; aplicado. Los valores de esta máscara son siempre 0 o 255.
global ej2b
ej2b:
; Te recomendamos llenar una tablita acá con cada parámetro y su
; ubicación según la convención de llamada. Prestá atención a qué
; valores son de 64 bits y qué valores son de 32 bits o 8 bits.
;
; r/m64 = rgba_t* dst
; r/m64 = rgba_t* src
; r/m32 = uint32_t width
; r/m32 = uint32_t height
; r/m8 = uint8_t amount
; r/m64 = uint8_t* mask
ret
; [IMPLEMENTACIÓN OPCIONAL]
; El enunciado sólo solicita "la idea" de este ejercicio.
;
; Dada una imagen origen ajusta su contraste de acuerdo a la parametrización
; provista.
;
; Parámetros:
; - dst: La imagen destino. Es RGBA (8 bits sin signo por canal).
; - src: La imagen origen. Es RGBA (8 bits sin signo por canal).
; - width: El ancho en píxeles de `dst`, `src` y `mask`.
; - height: El alto en píxeles de `dst`, `src` y `mask`.
; - control: Una imagen que que regula el nivel de intensidad del filtro en
; cada píxel. Es en escala de grises a 8 bits por canal.
global ej2c
ej2c:
; Te recomendamos llenar una tablita acá con cada parámetro y su
; ubicación según la convención de llamada. Prestá atención a qué
; valores son de 64 bits y qué valores son de 32 bits o 8 bits.
;
; r/m64 = rgba_t* dst
; r/m64 = rgba_t* src
; r/m32 = uint32_t width
; r/m32 = uint32_t height
; r/m64 = uint8_t* control
ret
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment