SoloCodigo

Programación General => ASM (Ensamblador) => Mensaje iniciado por: Malik en Martes 20 de Enero de 2009, 19:05

Título: duda en int21h (función 02h)
Publicado por: Malik en Martes 20 de Enero de 2009, 19:05
Llevo toda la tarde con lo mismo y me estoy volviendo loco. No tengo ni idea que puedo estar haciendo mal o que no entiendo. Os pongo el programa:

Código: ASM
  1.  
  2. .model small
  3.     .stack
  4.     .data
  5. tabla1  db  "hola mundo"
  6. longitud    equ ($ - tabla1)
  7.     .code
  8. Main:
  9.     mov ax, @data
  10.     mov ds, ax
  11.    
  12.     mov al, 'o'
  13.     mov cx, longitud
  14.     xor si, si
  15.    
  16.     jmp $ln3@main
  17.    
  18. $ln2@main:
  19.     dec cx
  20. $ln3@main:
  21.     cmp cx, 0
  22.     je $ln4@main
  23.     cmp tabla1[si], al
  24.     jne no_igual
  25.     inc dl
  26. no_igual:
  27.     inc si
  28.     jmp $ln2@main
  29. $ln4@main:
  30.    
  31.     add dl, 30h
  32.     mov ah, 02
  33.     int 21h
  34.    
  35.     mov ah, 4ch
  36.     int 21h
  37. end Main
  38.  
  39.  

Como podéis ver, eso cuenta el número de "o" que tiene la cadena hola mundo, y lo almacena en dl. Luego, le sumo 30h para, mediante la interrupción 21h y función 02, imprimir en pantalla el carácter, que representa el número de caracteres encontrados.

Pero cuando lo ejecuto me suelta por pantalla una O. Pero si lo depuro paso a paso, cuando salgo del depurado si me ha imprimido un 2. Por que pasa esto?  :brickwall:

Si tengo que dl es 2, 2 + 30h = 32h. Que corresponde al carácter 2, porque me imprime ese O.

Una ayudita que me sale humo por las orejas xD

thanks!!
Título: Re: duda en int21h (función 02h)
Publicado por: Eternal Idol en Martes 20 de Enero de 2009, 20:50
Desde el depurador funciona de casualidad ya que este inicializa los registros a cero cosa que vos no haces con dl por lo tanto estas incrementando un valor indeterminado:

Código: Text
  1.  
  2. ...
  3. xor dl, dl
  4. jmp $ln3@main
  5. ...
  6.  
Título: Re: duda en int21h (función 02h)
Publicado por: Malik en Martes 20 de Enero de 2009, 20:55
Cita de: "Eternal Idol"
Desde el depurador funciona de casualidad ya que este inicializa los registros a cero cosa que vos no haces con dl por lo tanto estas incrementando un valor indeterminado:

Código: Text
  1.  
  2. ...
  3. xor dl, dl
  4. jmp $ln3@main
  5. ...
  6.  


Me cago en tooo lo que se menea jajaja. Muchas gracias por la ayuda tio ;)
Título: Re: duda en int21h (función 02h)
Publicado por: Eternal Idol en Martes 20 de Enero de 2009, 22:18
De nadas  B)