# Sintaxis en ensamblador o en c para separar un byte



## transistor007 (Feb 25, 2009)

hola que tal, alguien conoce alguna instruccion en lenguaje ensamblador o en c para separar un byte por su parte alta y baja ejemplo:
 variable=0x1f;

y debe separar el byte como parte alta=1 y parte baja=f. 

he estado intentando en el microc pero la instruccion lo(variable) y hi(variable) no me funciona....

alguien conoce alguna otra en c o ensamblador que me ayude?
gracias..


----------



## Dr. Zoidberg (Feb 25, 2009)

transistor007 dijo:
			
		

> hola que tal, alguien conoce alguna instruccion en lenguaje ensamblador o en c para separar un byte por su parte alta y baja ejemplo:
> variable=0x1f;
> 
> y debe separar el byte como parte alta=1 y parte baja=f.
> ...



Es fácil hacer eso:


```
unsigned char variable, alta, baja;

byteCompleto = 0x1F;

alta = (variable & 0xF0) >> 4;
baja = variable & 0x0F;

/* Listo...alta y baja contienen en el nibble menos significativo la parte alta (0x01) y la baja (0x0F) del byte a partir*/
```
Saludos!


----------



## transistor007 (Feb 25, 2009)

excelente funcionó ezavalla!

gracias hoy aprendí algo nuevo..


----------



## Dr. Zoidberg (Feb 25, 2009)

transistor007 dijo:
			
		

> excelente funcionó ezavalla!
> 
> gracias hoy aprendí algo nuevo..



vas a tener que estudiar los operadores de bits en el C...es la forma mas facil de hacerlo y siempre anda.

Saludos!


----------



## sangreaztk (Feb 25, 2009)

Si solo quiere la parte alta o baja de un dato, en ensamblador puedes aplicarle al dato una operación lógica 'and' con 0x0F (para nibble bajo) y 0xF0 (para nibble alto).

Buena Vibra!


----------



## transistor007 (Mar 3, 2009)

Es fácil hacer eso:


```
unsigned char variable, alta, baja;

byteCompleto = 0x1F;

alta = (variable & 0xF0) >> 4;
baja = variable & 0x0F;

/* Listo...alta y baja contienen en el nibble menos significativo la parte alta (0x01) y la baja (0x0F) del byte a partir*/
```
Saludos![/quote]

Htal tengo algunos con este codigo que me paso el buen ezavalla!, primero: el numero que deseo convertir es decimal, de tal manera que cuando convierto un 17decimal, como parte alta me entrega un 0x01 y en la parte baja un 0x01 que si juntamos ambos son hexadecimales! y me gustaria que fueran decimales, pues posteriormente debo accesar a un calculo de una tabla...

alguien me puede ayudar o dar un idea?

gracias


----------



## Chico3001 (Mar 3, 2009)

Recuerda que en la computadora no existen numeros decimales, todo lo maneja en hexadecimal, como el equivalente decimal de 17d es 11h entonces la computadora lo esta haciendo bien

Lo que tendrias que hacer es una conversion Hexadecimal a BCD y despues aplicar el codigo de arriba, pero toma en cuenta que una vez que lo hagas tu numero ya no sera tan facil de procesar por la computadora, por lo que tendrias que aplicar algoritmos especiales para poder hacer calculos con un numero BCD

Para poderte resolver bien la duda necesitariamos que nos dijeras exactamente bien que quieres hacer con ese numero, y asi podriamos generar un codigo que te ayude....


----------



## transistor007 (Mar 3, 2009)

oho perfecto gracias buen chico3001, te comento lo siguiente:

tomo un valor del adc de temperatura, mi adc es de 10 bits para lo cual ya realice una tabla de equivalencias ejemplo un valor de 65 en el adc equivale a 32°c. el valor de 65 lo estoy tomando como un numero decimal el cual lo fracciono en 2 partes: parte alta y parte baja. para que? pues para desplegarlo en un 7segmentos que tambien ya tengoi una tablita que funciona perfectamente y despliega los numeros que mando a desplegar...
el problema que ahorita enfrento es cuando separo la parte alta y la baja ya no me corresponde al numero que quiero recojer de mi tabla para desplegarlo en 7 segmentos!

saludos y gracias por tu ayuda espero me puedas brindar alguna idea!


----------



## Chico3001 (Mar 3, 2009)

aaaah.. si es como te dije.. primero tienes que convertir el numero a BCD y despues usar la tabla... puedes usar esta rutina para convertir el valor de un numero entero con signo 


```
signed char		a, b, c, d;				// Variables de conversion BCD
signed int		n;					//
// ---------------------------------------------------------------------
//	b2bcd.- Convierte un numero de 16 bits con signo
//		de binario a BCD
// ---------------------------------------------------------------------
void b2bcd(signed int dato){

n=dato;
if (n < 0) {
	n = -n;
}

for ( a = -1; n >= 0; n -= 10000 ) ++a;
for ( b = 10; n <  0; n += 1000  ) --b;
for ( c = -1; n >= 0; n -= 100   ) ++c;
for ( d = 10; n <  0; n += 10    ) --d;
}
```

O esta es para un solo byte no mayor a 99:


```
int l_digit, h_digit;     // resultado de la conversion bin2bcd
 

void bin2bcd(int valor){  // Funcion que convierte de Binario a BCD

  h_digit=0;

  if (valor>=10){
    do{
      valor-=10;
      h_digit++;
    }while (valor>=10);
  }
  l_digit=valor;
}
```


----------

