From 96ab64038a9a16f43cc7a11a3eed3bee4cd2ebfd Mon Sep 17 00:00:00 2001 From: Bruno Ernesto Ventrici <bventrici@dc.uba.ar> Date: Thu, 3 Oct 2024 11:41:16 -0300 Subject: [PATCH] correcciones --- p1/ej1.asm | 23 ++++++++++++--------- p1/ej2.asm | 59 +++++++++++++++++++++++++++++++++++------------------- 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/p1/ej1.asm b/p1/ej1.asm index 30fa89c..8436326 100644 --- a/p1/ej1.asm +++ b/p1/ej1.asm @@ -2,11 +2,12 @@ extern malloc section .rodata ; Acá se pueden poner todas las máscaras y datos que necesiten para el ejercicio -%define INDICE_ELEM_SIZE 16 -%define INV_ELEM_SIZE 32 -%define NOMBRE_OFF 0 -%define FUERZA_OFF 20 -%define DURABILIDAD_OFF 24 +; BR LOS OFFSETS SE PONEN EN BYTES +%define INDICE_ELEM_SIZE 16 ; BR 2 BYTES OK +%define INV_ELEM_SIZE 32 ; BR NO +%define NOMBRE_OFF 0 ; BR OK +%define FUERZA_OFF 20 ; BR OK +%define DURABILIDAD_OFF 24 ; BR OK section .text ; Marca un ejercicio como aún no completado (esto hace que no corran sus tests) @@ -78,19 +79,21 @@ es_indice_ordenado: mov r12w, dx ;primero voy a querer ir obteniendo los elementos del indice para indexar el inventario .cicloIndice: - cmp r15w, dx + cmp r15w, dx ; BR DX ES VOLATIL Y NO SE PRESERVO EN EL CALL je .fin xor rdi, rdi xor rsi, rsi mov r8w, [r13] - mov r9w, [r13 + 16] + mov r9w, [r13 + 16] ; BR SERÃA +2 ;preparo la sequence call para llamar al comparador con los dos primeros items mov rdi, [r14 + r8*8] ;indexo el inventario con el indice por el tamaño de los punteros elementos mov rsi, [r14 + r9*8] - call [rcx] ;llamo al comparador, va a retornar el resultado en rax + call [rcx] ; BR ES CALL RCX SIN LOS [] SI LA DIRECCIÓN ESTà EN RCX + ; BR FALTÓ PRESERVAR RCX (VOLATIL) + ;llamo al comparador, va a retornar el resultado en rax cmp rax, byte 0 ;si rax es 1, osea false, retorno dicho valor je .fin @@ -158,8 +161,9 @@ indice_a_inventario: ;quiero pedir espacio para un array de punteros a item mov rax, 8 ;muevo a rax el tamaño de los punteros mul dx - mov rdi, rax + mov rdi, rax ; OK call malloc + ; BR FALTÓ PRESERVAR RSI, RDI, DX QUE SE USAN DESPUES mov r12, rax mov r13, 0 @@ -171,6 +175,7 @@ indice_a_inventario: mov r15, [rdi + r14*8] mov [r12], r15 + ; BR SIEMPRE ESTà ESCRIBIENDO EN [R12] YA QUE NO MODIFICA R12 ENTRE CADA ITERACIÓN add rsi, 2 add rdi, 8 jmp .ciclo diff --git a/p1/ej2.asm b/p1/ej2.asm index 24dd2bb..92666d1 100644 --- a/p1/ej2.asm +++ b/p1/ej2.asm @@ -10,11 +10,15 @@ CONST_32: times 4 dd 32.0 CONST_128: times 4 dd 128.0 MASK_AMOUNT: db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF -SUFFLE_MASK: db 0x00, 0x04, 0x0C, 0x80 - db 0x01, 0x05, 0x0D, 0x80 - db 0x02, 0x06, 0x0E, 0x80 - db 0x03, 0x07, 0x0F, 0x80 - +; BR SUFFLE_MASK: db 0x00, 0x04, 0x0C, 0x80 +; db 0x01, 0x05, 0x0D, 0x80 +; db 0x02, 0x06, 0x0E, 0x80 +; db 0x03, 0x07, 0x0F, 0x80 +; BR ESTABA AGARRANDO MAL EL AZUL +SUFFLE_MASK: db 0x00, 0x04, 0x08, 0x80 + db 0x01, 0x05, 0x09, 0x80 + db 0x02, 0x06, 0x0A, 0x80 + db 0x03, 0x07, 0x0B, 0x80 section .text @@ -69,7 +73,7 @@ ej2a: mov rbp, rsp ; Preservamos los registros no volátiles. - push r12 ; desalineado + push r12 ; desalineado ; BR PARA QUE SI DESPUÉS NO SE USAN? push r13 ; alineado ;cargo las mascaras @@ -81,10 +85,16 @@ ej2a: movdqu xmm12, [CONST_128] movdqu xmm11, [CONST_32] - movdqu xmm9, [MASK_AMOUNT] - movd xmm10, r8d - pand xmm10, xmm9 ;Limpio los valores superiores en caso de que haya basura - pmovzxbd xmm10, xmm10 + ;movdqu xmm9, [MASK_AMOUNT] + ;movd xmm10, r8d ; BR LA MÃSCARA SOLO ES UN BYTE + ;pand xmm10, xmm9 ;Limpio los valores superiores en caso de que haya basura ; BR ESO SOLO LIMPIA EL BYTE MAS SIGNIFICATIVO DE XMM10 + ;pmovzxbd xmm10, xmm10 ;BR ESTA EXTENDIENDO 4 BYTES A DWORD PERO LA MASCARA SOLO LA TIENE EL BYTE MENOS SIGNIFICATIVO + ;cvtdq2ps xmm10, xmm10 + + ; BR UNA FORMA DE CARGAR LA MÃSCARA PARA ESTA SOLUCIÓN: + movzx r8, r8b ; BR EXTENDEMOS DE BYTE A QWORD + movd xmm10, r8d ; BR AHORA EN XMM10 LA DWORD MENOS SIGNIFICATIVA TIENE EL VALOR DE LA MÃSCARA + pshufd xmm10, xmm10, 0x0 ; BR HACEMOS QUE LAS 4 DWORD TENGAN EL VALOR DE LA MÃSCARA CON UN SHUFFLE cvtdq2ps xmm10, xmm10 xor r8, r8 @@ -92,34 +102,40 @@ ej2a: xor r9, r9 .x_loop: - movdqu xmm1, [rsi] + movdqu xmm1, [rsi] ; BR ES MEJOR LEER UNA SOLA VEZ Y DESPUÉS COPIARLOS movdqu xmm2, [rsi] movdqu xmm3, [rsi] ;Voy a aislar cada canal para trabajarlo por separado - pand xmm1, xmm15 ;rojo [R---, R---, R---, R---] + pand xmm1, xmm15 ;rojo pand xmm2, xmm14 ;verde pand xmm3, xmm13 ;azul ;Acomodo cada color la principio - movdqu xmm4, xmm1 - psrldq xmm4, 3 - por xmm1, xmm4 - psrldq xmm4, 3 - por xmm1, xmm4 - psrldq xmm4, 3 - por xmm1, xmm1 ;[R,R,R,R,-,-,-,-,-,-,-,-] + ; BR xmm1=[000R000R000R000R] + movdqu xmm4, xmm1 ; BR xmm4=[000R000R000R000R] + psrldq xmm4, 3 ; BR xmm4=[000000R000R000R0] + por xmm1, xmm4 ; BR xmm1=[000R00RR00RR00RR] + psrldq xmm4, 3 ; BR xmm4=[000000000R000R00] + por xmm1, xmm4 ; BR xmm1=[000R00RR0RRR0RRR] + psrldq xmm4, 3 ; BR xmm4=[000000000000R000] + ;por xmm1, xmm1 ; BR xmm1=xmm1 !! + por xmm1, xmm4 ; BR xmm1=[000R00RR0RRRRRRR] + ;[R,R,R,R,-,-,-,-,-,-,-,-] movdqu xmm4, xmm2 psrldq xmm2, 1 ;acomodo el verde en la primera posicion - psrldq xmm4, 3 + psrldq xmm4, 1 ;acomodo el verde en la primera posicion ; BR TAMBIÉN CON XMM4 + + psrldq xmm4, 3 por xmm2, xmm4 psrldq xmm4, 3 por xmm2, xmm4 psrldq xmm4, 3 - por xmm2, xmm4 + por xmm2, xmm4 movdqu xmm4, xmm3 psrldq xmm3, 2 ;acomodo el azul en la primera posicion + psrldq xmm4, 2 ;acomodo el azul en la primera posicion ; BR TAMBIÉN CON XMM4 psrldq xmm4, 3 por xmm3, xmm4 psrldq xmm4, 3 @@ -164,6 +180,7 @@ ej2a: packuswb xmm1, xmm3 ;[RRRR,GGGG,BBBB,0000], pero necesito [RGB0, .. , .., RGB0] movdqu xmm6, [SUFFLE_MASK] + pshufb xmm1, xmm6 ;aplico un shffle para acomodar los pixeles pxor xmm1, xmm8 ;fijo el alpha -- GitLab