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"  &#59; 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

[0] Índice de Mensajes

Ir a la versión completa