Movimiento de mascara

Iniciado por cpu2, 19 Marzo 2014, 19:02 PM

0 Miembros y 1 Visitante están viendo este tema.

cpu2

Hola

Tengo que mover los byte que tengan el bit 7 en 1, ya tengo una funcion aplicada con maskmovq que hace precisamente lo que quiero, pero lo malo de esa instruccion es que a la CPU le cuesta 32 OPS.

Código (asm) [Seleccionar]
; %mm0 = 0x8001018080010180

maskmovq %mm0, %mm0  ; (%rdi) = 0x8000008080000080


Hay otra instruccion llamada pmovmskb es 1 OPS, que copia el bit 7 en un registro de 32 bits haciendo un octeo con los registros que tienen ese bit en 1.

Código (asm) [Seleccionar]
; %mm0 = 0x8001018080010180

pmovmskb %mm0, %esi  ; %esi = 0x99


Bien alguien me da alguna idea de como construir una mascara, a partir de ese octeo para copiar los byte tal y como lo hace maskmovq?

Un saludo.

x64core

He visto varios temas tuyos acerca de cómo optimizar con extensiones asi que te recomiendo este foro:
http://www.masm32.com/board/index.php
Usuarios con bastante conocimiento en ensamblador en general.

cpu2

Si por lo que he visto hay buenas preguntas, aun estoy con AES tengo todas las funciones menos la mixcolumns, multiplico el registro xmm por 2 y 3, ahora solo me queda ordenarlo corriendo los bits.

https://www.ecs.csus.edu/csc/iac/docs/students/Vinit_Azad_MS_Report.pdf

Si miran ese pdf en la pagina 29 veran una tabla con los ciclos de cada funcion, no se de donde sera esa tabla pero la he visto por muchos lados, sumando todas las funciones 1 ronda cuesta unos 222, yo calculo que mi ronda estara en unos 170 - 180.

Tambien cree una funcion strlen con los xmm para el mismo AES, no he calculado la potencia porque no se hacerlo, pero segurisimo que peta mil veces a la de C/C++.

Pero todo esto son para mis proyectos, me gustaria compartirlos, pero no, a no ser que se conbinen con algun code como puede ser un malware.

Un saludo.

x64core

Cita de: cpu2 en 22 Marzo 2014, 18:37 PM
Si por lo que he visto hay buenas preguntas, aun estoy con AES tengo todas las funciones menos la mixcolumns, multiplico el registro xmm por 2 y 3, ahora solo me queda ordenarlo corriendo los bits.

https://www.ecs.csus.edu/csc/iac/docs/students/Vinit_Azad_MS_Report.pdf

Si miran ese pdf en la pagina 29 veran una tabla con los ciclos de cada funcion, no se de donde sera esa tabla pero la he visto por muchos lados, sumando todas las funciones 1 ronda cuesta unos 222, yo calculo que mi ronda estara en unos 170 - 180.
Mira esta clase hecha por MichaelW:
http://masm32.com/board/index.php?topic=49.msg10832;topicseen#msg10832
Sirve para calcular los ciclos que require el procesador para ejecutar un bloque de código.

Cita de: cpu2 en 22 Marzo 2014, 18:37 PM
Tambien cree una funcion strlen con los xmm para el mismo AES, no he calculado la potencia porque no se hacerlo, pero segurisimo que peta mil veces a la de C/C++.
Pues habria de ver si activamos las extensiones en el compilador y a comparar.

Cita de: cpu2 en 22 Marzo 2014, 18:37 PM
Pero todo esto son para mis proyectos, me gustaria compartirlos, pero no, a no ser que se conbinen con algun code como puede ser un malware.

Un saludo.
Pues si lo vas a compartir, compartelo, de ninguna manera podes controlar que tu código sea sólo usado para aplicaciónes legitimas y no para
malware, es como decir que los creadores que compiladores, ensambladores sólo los programaron para crear aplicaciónes legitimas y no para malware.
Pero para que despreocuparte te doy mi punto de vista, nunca usaria un código que utilizaria extensiones tan recientes para malware ya que
estaria sujeto a funcionar sólo en cierto tipo de procesadores, además de dejarle bastante facil el trabajo a las compañias de AV de agregar
sus firmas en mi ejecutable, etc. ellos no van de la mano


cpu2

No, me referia en compartir el codigo para algun proyecto como puede ser en malware, o en otro y sacar algo de dinero.

Las extensiones son de la SSE a la SSE2, son compatibles, no estoy usando las AVX.

Por lo que veo aqui hay muchos desarrolladores, pero por lo que veo a nadie le interesa las implementaciones que creo, bueno como hay muchas strlen por hay comparto la mia, si alguien quiere hacer algo pues que me comente.

http://foro.elhacker.net/asm/aporte_strlen_xmm-t411158.0.html

Ya puedes analizarla si quieres x64Core, pero las funciones AES no digo nada.

Un saludo.

x64core

Cita de: cpu2 en 22 Marzo 2014, 21:28 PM
No, me referia en compartir el codigo para algun proyecto como puede ser en malware, o en otro y sacar algo de dinero.

Las extensiones son de la SSE a la SSE2, son compatibles, no estoy usando las AVX.

Por lo que veo aqui hay muchos desarrolladores, pero por lo que veo a nadie le interesa las implementaciones que creo, bueno como hay muchas strlen por hay comparto la mia, si alguien quiere hacer algo pues que me comente.

http://foro.elhacker.net/asm/aporte_strlen_xmm-t411158.0.html

Ya puedes analizarla si quieres x64Core, pero las funciones AES no digo nada.

Un saludo.
No es que a nadie le interese, sino que estas en el foro incorrecto, conozco a muchos programadores amantes del
lenguaje ensamblador como tú, ellos que se toman un tiempo para optimizar un bloque de código, que toman el lenguaje
ensamblador como un 'arte' y aquí hay muy pocas personas o ninguna. Ve al foro que te mencione ellos tomaran más
interes y aprenderas mucho más cosas con ellos ^^. no digo que un foro es mejor que otro, simplemente son diferentes.

cpu2

Bueno ya la optimize, de 64 OPS que consume maskmovdqu yo lo hice en 4 OPS jeje.

Código (asm) [Seleccionar]
.section .data

bts0_: .quad 0x8080808080808080,0x8080808080808080

.section .text
.globl _start

_start:

movdqa %xmm0, %xmm1

pand bts0_, %xmm0
pcmpeqb bts0_, %xmm0
pand %xmm0, %xmm1


Por cierto, deje la respuesta en este foro y en el otro, buen foro tienes razon, pero lo saque todo yo jeje.

Un saludo.