Acesso a un bit concreto del registro

Iniciado por silver2050, 24 Noviembre 2012, 19:52 PM

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

silver2050

Buenas a todos,

A ver si alguien puede echarme una mano, necesito saber como podría acceder a un bit concreto de un registro, es decir, acceder al bit 20 del registro EDX para saber su valor por ejemplo.

Saludos y gracias. 

x64core

Cita de: silver2050 en 24 Noviembre 2012, 19:52 PM
Buenas a todos,

A ver si alguien puede echarme una mano, necesito saber como podría acceder a un bit concreto de un registro, es decir, acceder al bit 20 del registro EDX para saber su valor por ejemplo.

Saludos y gracias. 
usando una mascara:

MOV EAX,293829382
AND EAX,100000h
TEST EAX,EAX
JE NOHAY
; bit activo
...

silver2050

Muchas gracias compañero, aunque me he perdido un poco. A ver si puedo explicarme mejor:

Necesito hacer una función con código C y ASM, la cual hace varias funcionalidades y recibe un entero de entrada, entonces necesitaría acceder al bit del registro correspondiente al entero (0-31) de forma dinámica, tendría que realizar la máscara de forma dinámica, en lugar de intentar hacer 32 máscaras diferente. Soy novato en ensamblador y no sé si sería posible utilizando SHR (desplazamientos a la derecha) y luego aplicando una máscara.  ¿Cómo lo véis?

Saludos y muchas gracias por vuestro tiempo y ayuda

Ferno

Por supuesto, si puedes determinar en tiempo de ejecución la posición del bit a procesar, haces un shift right con el número de desplazamiento correspondiente al calculado en tiempo de ejecución y siempre utilizas el AND con el número 1. Así podrás saber si está activado el bit en cualquier posición.

x64core

Seria SHL, no SHR, y recordar establecer el registro a 1. tambíen se podria hacer con SHR pero seria de forma inversa aunque lo más
correcto seria SHL

Ferno

Cita de: RHL en 24 Noviembre 2012, 21:22 PM
Seria SHL, no SHR, y recordar establecer el registro a 1. tambíen se podria hacer con SHR pero seria de forma inversa aunque lo más
correcto seria SHL

En realidad, depende. Al menos lo que yo dije que le entendí a el, sería hacer un shift right del registro donde posee el valor correspondiente (el bit que quiere identificar). Claro que se puede hacer un shift left al registro que contenga el "1" y "construir dinámicamente" la máscara. Pero bueno, son opciones :P

silver2050

#6
Gracias  a ambos.

Entonces si quiero obtener el bit 17 de edx, podría utilizar:

SHL edx, 17  //¿podría utilizar [ebp+8], en lugar del 17?, sería donde se guarda el parámetro de entrada. La función que contiene mi código ASM sería "mi_función(int posicion)"
AND edx, 0x80000000
TEST edx,edx