Interpretar una mask byte

Iniciado por cpu2, 11 Febrero 2014, 18:15 PM

0 Miembros y 2 Visitantes están viendo este tema.

cpu2

Hola

Siento el titulo del post, no sabia muy bien que poner.

Bien tengo el siguiente problema, tengo un quadword y lo que tengo que hacer es comprobar el ultimo bit de cada byte y almacenarlo en un registro.

Código (asm) [Seleccionar]
0x8000000000000080

Esto dejaria un octeo 0x81, bien lo que tengo que hacer despues de comprobar el bit, es a los bytes del quadword que su primer bit dieron 1 es hacer un xor, sin afectar a los demas bytes claro.

Comprobar el bit se hacerlo, lo que no se es como interpretar luego el 0x81, porque depende del quadword el valor puede ser distinto, que pasos puedo seguir o que metodo?

Pero no me dijan comparando ya que tengo un monton de posibilidades, y tendria que hacer una tabla giigante para los xor.

Un saludo.

El Benjo

Eso lo haces mediante una operación AND con el valor 0x81 Y comparas si el resultado es 0x81

¿Qué lenguaje estás utilizando?
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

cpu2

Gracias por el interes, pero como dije esa opcion no es valida, el quadword puede variar, eso es un ejemplo, el octeo 0x81 es en binario 10000001, entonces sabria que tengo que hacer un xor al ultimo byte y al primero, pero como dije anteriormente comparando no puedo ya que tengo muchas posiblilidades. Que pasaria si fuera:

Código (asm) [Seleccionar]
0x800000000008080

Entonces el octeo seria 0x83 y ese metodoo que tu dices no vale.

No se si se me entiende.

Un saludo.

P.D: Lenguaje ASM.

El Benjo

#3
No me has entendido, como yo te dije es realizar primero una función AND con el valor que deseas. Es decir que si tu variable fuera 10111001:




Tu valorVariable
10000001AND10111001

El resultado sería 10000001 y si el valor de la variable fuera 10111000 tu valor al final sería 10000000.

De esta forma ya puedes compararlo. Estoy muy falto de práctica en asembler, pero puedes subir la parte del código que hace la comparación y quizá te pueda hacer ejemplo si es que todavía no lo entiendes.

¿Qué sintaxis assembler utilizas? ¿MASM o AT&T?
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

cpu2

Bueno voy a empezar desde 0, y dejo el codigo.

Lo que pretendo es hacer una funcion de AES una multiplicacion, bien a  los bytes que pasen de 8 bits "word" tengo que hacerles una reduccion modular 0x1b.

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

mx_: .quad 0x7f7f7f7f7f7f7f7f,0xffffffffffffffff

.section .text
.globl _start

_start:

pmovmskb %xmm0, %esi
pand mx_, %xmm0
pslld $1, %xmm0


Bien con pmovmskb copio el bit 7 de todos los octeos del quadword, luego con el and elimino el bit 7 para que cuando los multiplique por 2 no sea un word, y el pslld pues multiplica cada byte del quadword en 2.

Pmovmskb guardo en forma de 1 bit los octeos que tenian el bit 7 en 1, en esi, bien lo que tengo que hacer es una reduccion modular a esos bytes guiandome con el valor de esi, pero como comprenderas no puedo hacer lo que tu dices, ya que no quiero comprobar un valor fijo, ese valor puede variar.

Como podria hacer eso? pero sin mil comparaciones.

Un saludo.