Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
Rafael Martin Monges Luces
individual-2c2024
Commits
1c47e2b9
Commit
1c47e2b9
authored
Sep 24, 2024
by
Rafael Martin Monges Luces
Browse files
Entrega parcial
parent
d1622584
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
294 additions
and
0 deletions
+294
-0
Parcial/ej1.asm
Parcial/ej1.asm
+187
-0
Parcial/ej2.asm
Parcial/ej2.asm
+107
-0
No files found.
Parcial/ej1.asm
0 → 100644
View file @
1c47e2b9
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
Parcial/ej2.asm
0 → 100644
View file @
1c47e2b9
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment