Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Ghio97 en 9 Octubre 2018, 23:24 pm



Título: Ayuda con DEBUG MS-DOS
Publicado por: Ghio97 en 9 Octubre 2018, 23:24 pm
 Hola tengo una pregunta, tengo mi codigo en debug que convierte una cadena de letras de minusculas a mayusculas pero quiero saber como seria el caso en el que si tienes una cadena con minusculas y mayusculas las convierta en su contrario, apenas estoy empezando y no me a quedado claro
aqui mi porgrama

-e ds:0200 "hola$"
-a 0100
0100:mov si, 0200
0103: mov cx,0a
0106:mov al,[si]
0108:and al,df
010a:mov dl,al
010c:mov ah,02
010e: int 21
0110:inc si
0111: loop 0106
-g 0113
HOLA




Título: Re: Ayuda con DEBUG MS-DOS
Publicado por: Serapis en 10 Octubre 2018, 10:56 am
Si tomas el código de las letras mayúsculas y minúsculas, verás que la diferencia entre ellas es de 32, es decir cambia el bit 5

Sea x el valor númerico del carácter (vamos el contenido en un registro)
Luego convertir Mayúscula a minúscula (poner el bit 5:
 x = x or 32
Aplicado en bucle sobre cada letra de la palabra:
     BIENvenido, el resultado sería
     bienvenido

De Minúscula a mayúscula (borrar el bit 5):
 x = x and (255-32)
Aplicado en bucle sobre cada letra de la palabra:
     BIENvenido, el resultado sería
     BIENVENIDO

Aquí hemos usado una máscara... una máscara empieza siempre con todos sus bits a 1 (ó 0, según interese el caso), y luego desactivar el/los bits no deseados. Aplicando luego un operador AND, fuerza a que mantenga a uno los bits que en la máscara también son 1, y en cambio pone a cero los bits 1 que tuviere en la misma posición que la máscara tiene 0...
Para entenderlo mejor, considera dos papeles, donde se representan los bits con un agujero cuando son 1 y sin agujero cuando son 0 (lógicamente correctamente alineados y equidistantes, etc...), la máscara sería uno tal que donde pone 1, tiene un agujero y donde tiene 0 es opaco... detrás está tu papel, con sus bits (huecos y no huecos), el resultado será 1 cuando logres ver a través de cada 'bit'  de ambos papeles... y 0, cuando no logres ver que hay detrás de ambos papeles.

Todavía resulta de interés cambiar de mayúscula o minúscula a su contrario (sin necesidad de conocer su valor previamente):
x= x xor 32
Aplicado en bucle sobre cada letra de la palabra:
     BiEnVenIDo, el resultado sería
     bIeNvENidO