Programación General > ASM (Ensamblador)
Contar El Numero De Veces Que Aparece Una Letra
(1/1)
tirengarfio:
Deberia decir "Hola Eternal" :),
he escrito un codigo que me cuenta el numero de letras "a" en la palabra "Hola".
El problema es que tabla1[4] es siempre igual que tabla1[3], con lo que la cuenta siempre es incorrecta.
Mis preguntas son dos:
- ¿Porque tabla1[4] es siempre igual a tabla1[3]? (Es que soy curioso...)
- ¿Hay alguna manera de correctamente este ejercicio? Se me ocurre que la linea "sub cl, 1" se podria sustituir por "sub cl, 2", pero quiza haya alguna manera mas "seria"...
--- Código: Text --- DOSSEG .MODEL SMALL .STACK 100h .DATA tabla1 DB "Hola" ; Una tabla de 0Ah caracterescarac DB "a" .CODE INICIO: mov ax, @data mov ds, ax xor di, di mov bh, carac[0] numero: add cl, 1 bucle: mov bl, tabla1[di] inc di cmp bl, carac je numero cmp di, 05h jl bucle sub cl, 1 FIN: mov ah, 4ch int 21h end INICIO
Un saludo
Javier
Eternal Idol:
--- Cita de: "tirengarfio" ---El problema es que tabla1[4] es siempre igual que tabla1[3], con lo que la cuenta siempre es incorrecta.
Mis preguntas son dos:
- ¿Porque tabla1[4] es siempre igual a tabla1[3]? (Es que soy curioso...)
--- Fin de la cita ---
tabla1 DB "Hola" ; Una tabla de 0Ah caracteres
carac DB "a"
En C:
tabla1[0] = 'H';
tabla1[1] = 'o';
tabla1[2] = 'l';
tabla1[3] = 'a';
¿Quien dijo que hay un tabla1[4]? Esta fuera de los limites y simplemente estas accediendo a carac que justamente es 'a' ;)
--- Cita de: "tirengarfio" ---- ¿Hay alguna manera de correctamente este ejercicio? Se me ocurre que la linea "sub cl, 1" se podria sustituir por "sub cl, 2", pero quiza haya alguna manera mas "seria"...
--- Fin de la cita ---
Incializa asi: tabla1 DB "Hola",0 y recorre las cadenas justo hasta encontrarte el 0 terminador de las mismas.
tirengarfio:
--- Citar ---¿Quien dijo que hay un tabla1[4]? Esta fuera de los limites y simplemente estas accediendo a carac que justamente es 'a' ;)
--- Fin de la cita ---
Ya se que esta fuera de los limites, pero ¿no te parece curioso que tabla1[4] albergue el mismo caracter que tabla1[3] siempre?
--- Citar ---Incializa asi: tabla1 DB "Hola",0 y recorre las cadenas justo hasta encontrarte el 0 terminador de las mismas.
--- Fin de la cita ---
Ok, aqui abajo esta mi codigo haciendo lo que tu me dices. Pero en el caso de que la letra que estoy contando (la "a") sea la que termina la palabra (Hola), tu consejo no funciona, al menos como yo lo hago...
--- Citar ---DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
tabla1 DB "Hola", 0 ; Una tabla de 0Ah caracteres
carac DB "a"
.CODE
INICIO:
mov ax, @data
mov ds, ax
xor di, di
mov bh, carac[0]
numero:
add cl, 1
bucle:
mov bl, tabla1[di]
inc di
cmp bl, carac
je numero
cmp tabla1[di], 0
jnz bucle
FIN:
mov ah, 4ch
int 21h
end INICIO
--- Fin de la cita ---
Eternal Idol:
--- Cita de: "tirengarfio" ---Ya se que esta fuera de los limites, pero ¿no te parece curioso que tabla1[4] albergue el mismo caracter que tabla1[3] siempre?
--- Fin de la cita ---
No ... es pura logica, cambia carac y tabla1[4] y tabla1[3] no seran iguales.
--- Cita de: "tirengarfio" ---Ok, aqui abajo esta mi codigo haciendo lo que tu me dices. Pero en el caso de que la letra que estoy contando (la "a") sea la que termina la palabra (Hola), tu consejo no funciona, al menos como yo lo hago...
--- Fin de la cita ---
Nuevamente pura logica, si recorres la cadena HASTA encontrarte el cero (mientras no sea cero el byte apuntado por ponerlo de otra manera) no tiene ningun sentido que no sea capaz de contar una cadena como Hola. Simplemente es una implementacion incorrecta.
La etiqueta numero se ejecuta independientemente del contenido de la cadena, tenga la letra buscada o no, saltala y ademas de que cl tendra cualquier valor incialmente ... ponelo a 0 al principio. Si usas las dos veces bl para comparar te funcionara tambien para terminar el bucle, si usas tabla1[di] no funciona por haber incrementado di primero al ser 'a' (di apunta a 0) en bucle y despues al entrar nuevamente en bucle desde numero (si la cadena fuera "holas" no pasaria pero es un error) apunta a la 'a' de carac.
Si le asignas a bh carac[0] usalo en la comparacion posterior tambien ... y en lugar de add 1 podes usar inc.
Navegación
Ir a la versión completa