Bueno, lo haremos como en C...
Para pasar a minusculas hariamos:
Salida == entrada && 0xDF
y para pasar a mayusculas:
Salida == entrada || 0x20
En realidad hay otra forma mas sencilla, creo que es utilizando la libreria <string.h> creo que hay una funcion toupper y otra tolower, en ese caso sera tan sencillo como:
Salida==toupper(entrada) para pasar a mayusculas y
Salida==tolower(entrada) para pasar a minusculas.
Las líneas en rojo están mal. Se debería de haber utilizado el operador de asignación = en vez de ==, que es el operador lógico de igualdad.
Además, el operador && realiza la operación lógica AND entre los dos operados devolviendo como resultado verdadero o falso. La operación lógica AND bit a bit entre los bits de los operandos se realiza con el operador &, que es lo que se pretende en este caso.
Lo mismo se puede decir del operador || que es la operación lógica AND y del operador | que es la operación lógica OR bit a bit entre los bits de los operandos.
Las líneas quedarían:
Salida = entrada & 0xDF;
Salida = entrada | 0x20;
Como comentario, aunque sumar y restar 20h es correcto y obtienes lo mismo, hacerlo de esa manera te obliga a hacer antes una comparación para saber si el carácter es mayúscula o minúscula y decidir si debes sumar, restar o no hacer nada. Por lo tanto es una solución peor (más ineficiente) que la operación lógica.
Un comentario sobre el programa de convertir a mayúsculas.
Nunca se deben poner en los programas "números mágicos" sin más al estilo del 32. Es una mala práctica de programación.
Si quieres "marcar paquete" con el profesor, un algoritmo más eficiente para intercambiar mayúsculas y minúsculas es darse cuenta que el código ASCII de una letra mayúscula (la 'A' por ejemplo es 0100 0001 ó 41h) y el de una minúscula (la 'a', por ejemplo es 0110 0001 ó 61h) difiere siempre en un único bit y es el de posición 5. Por lo tanto, si a cualquier letra le pones ese bit a 1, la tendrás en minúscula, si se lo pones a 0, la tendrás en mayúscula y si cambias el valor de ese bit, la cambias entre mayúscula <-> minúscula.
Esos cambios son triviales si haces la operación or, and o xor con la máscara 20h.
se nota el venir del ensamblador, lo de las and y las or,
PD: en C también se pueden usar...
Pues tal y como se me estan dando las cosas, tengo que decir que estoy con dedalo "viva el ensamblador".
Ejercicio de la tabla de edades, tiempo efectivo más de 12h
Calculadora, suma, resta, multiplicación, con pic y ensamblador, no tarde ni tres horas.
Teniendo en cuenta que el programa en C son 20 lineas de codigo y el ensamblador fueron 170 lineas, juzgar que se me da mejor....
Desde la total y completa ignorancia en esto del C, poner 20h no seria otro "número mágico" pero en hexadecimal en vez de decimal?????
Pues tal y como se me estan dando las cosas, tengo que decir que estoy con dedalo "viva el ensamblador".
Por cierto, para pasar de minúsculas a mayúsculas, no hace falta decidir nada, le aplicas la AND y como la pones a cero a piñon, es como si restaras 32 si es minúscula o no hicieras nada si es mayúscula.
20h es en hexadecimal, lo mismo que 32 en decimal o 32d
Pero al hacer la AND y la OR no sumas o restas, solo pones a uno o a cero un bit, mira la traza:
0100 0001 en binario ó 41h ó 65d (es la 'A' en ASCII)
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)
Fijate que se diferencia solo en un bit ¿que conseguimos si hacemos esto?
0110 0001 en binario ó 61h ó 97d (es la 'a' en ASCII)
AND
1101 1111 en binario ó DFh (no hace falta lo otro)
=
0101 0001 en binario ó 41h ó 65d, vamos la 'A' en ASCII, sin sumas ni restas.
A esto se refiere owockadoy. que ya ha puesto como se pondría en C.
nouc= c & 0xDF;
Como regla general los "números mágicos" no deben aparecer en medio del código porque sí. Se pueden admitir sólo si aparecen una única vez en una función concreta y con un comentario al lado explicando qué es eso.
La práctica correcta es colocar en la cabecera del programa un #define por cada una de las constantes que utilices (con un comentario apropiado, por supuesto) y luego usar esa constante definida a lo largo del programa. De esa manera, si por cualquier razón la constante tiene que cambiarse, sólo se hace una vez en la cabecera y sus efectos se propagan a lo largo del código.
Ya, ¿Y con los simbolos que hay por encima y por debajo de a:z y A:Z?
Por ejemplo, los numeros en una cadena se convertirian en caracteres de control,mira la tabla ASCII, desde el 0 al 9, si les quitas el 5º bit te quedan los caracteres de control:
0 -> DLE
1 -> DC1
2 -> DC2
3 -> DC3
4 -> DC4
5 -> NAK
6 -> SYN
7 -> ETB
8 -> CAN
9 -> EM
El control es para que la conversion se aplique exclusivamente a los caracteres a los que esta dirigida la operacion.
Si pero, hay que comparar las mismas cosas, ¿cuanto cuesta realizar el programa de estas tablas en ensamblador?
"Tu saber no que dices, mi joven aprendiz"
Fdo: Yoddah
Por eso me ha dejado mi compi que esta en la uni un librito mu guapo "introducción a la programación en C" de marco A. peña y Jose M. Cela de ediciones UPC que es la monda, por lo menos entiendo lo que me explica.....
Quieres decir que tardaria más de 12h????????
no lo creo.....
Uy, ese me suena (claro que el nombre tampoco es gran cosa ) ¿es rojo?
Ten en cuenta que el ensamblador "ya lo dominas" y el C todavía no. Cuando lo domines verás.
De todas maneras, recuerda el C te lo puedes llevar a cualquier parte, cosa que el ensamblador no, aunque te cueste creerlo, el programa de las mayúsculas lo puedes pasar casi sin modificar a un PIC, y funcionará, dependiendo del compilador, el printf y el scanf se referirá al puerto serie, pero funcionará.