• Sábado 20 de Abril de 2024, 04:28

Autor Tema:  Procedimiento para mostrar cadena con interrupción MASM  (Leído 2064 veces)

Malik

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Procedimiento para mostrar cadena con interrupción MASM
« en: Viernes 26 de Diciembre de 2008, 20:30 »
0
Hola, tengo este código:

Código: Text
  1.  
  2.                 dosseg
  3.                 .model small
  4.                 .stack 100h
  5.                 .data
  6. cadena          db  "Hola que tal$"
  7.                 .code
  8. muestra         proc
  9.                 lea dx, cadena
  10.                 mov ah, 09h
  11.                 int 21
  12.                 iret
  13. muestra         endp
  14.  
  15. inicio:         mov ax, @data
  16.                 mov ds, ax
  17.                 ;cargar vector interrupcion
  18.                 ;int 21h Función ah=25h  al=tipo int ds:dx rutina int
  19.                 mov al, 52h
  20.                 mov dx, offset muestra
  21.                 mov bx, seg muestra
  22.                 mov ds, bx
  23.                 mov ah, 25h
  24.                 int 21h
  25.                
  26.                 ;Ejecuta procedimiento
  27.                 int 52h
  28.                
  29.                 ;devuelve el control al dos
  30.                 mov ah, 4ch
  31.                 int 21h
  32.                 end inicio
  33.  
  34.  

Esto debería de imprimir por pantalla mi cadena. Pero cuando llega a int52h, no entra al procedimiento y no sé cual es el fallo

Una ayudita please, que no veo que hago mal  :brickwall:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Procedimiento para mostrar cadena con interrupción MASM
« Respuesta #1 en: Sábado 27 de Diciembre de 2008, 13:46 »
0
2 cosas mal al menos:

1. Linea 11, usas notacion decimal con lo cual esa es la interrupcion 15 en hex.
2. DS no apunta al segmento .data donde esta la cadena (DX es correcto pero DS no).


PD. Despues esta el tema de que tu codigo no es residente y no restauras el vector de interrupcion original ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Malik

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Procedimiento para mostrar cadena con interrupción MASM
« Respuesta #2 en: Miércoles 31 de Diciembre de 2008, 14:35 »
0
Gracias Eternal Idol :good:

os pongo el código funcionando:

Código: Text
  1.  
  2.                 dosseg
  3.                 .model small
  4.                 .stack 100h
  5.                 .data
  6. cadena          db  "Hola que tal$"
  7.  
  8.                 .code
  9. muestra         proc
  10.                 lea dx, cadena
  11.                 mov ah, 09h
  12.                 int 21h
  13.                 iret
  14. muestra         endp
  15.  
  16. inicio:         mov ax, @data
  17.                 mov ds, ax
  18.                 ;cargar vector interrupcion
  19.                 ;int 21h Función ah=25h  al=tipo int ds:dx rutina int
  20.                 push ds
  21.                 mov al, 52h
  22.                 mov dx, offset muestra
  23.                 mov bx, seg muestra
  24.                 mov ds, bx
  25.                 mov ah, 25h
  26.                 int 21h
  27.                 pop ds
  28.                
  29.                 ;Ejecuta procedimiento
  30.                 int 52h
  31.                
  32.                 ;devuelve el control al dos
  33.                 mov ah, 4ch
  34.                 int 21h
  35.                 end inicio
  36.  
  37.  

Cita de: "Eternal Idol"
PD. Despues esta el tema de que tu codigo no es residente y no restauras el vector de interrupcion original ...
Esto no lo entendí muy bien, podrías explicarmelo un poquillo más, que estoy bastante pez en el tema  :ouch:

Un saludo  :beer:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Procedimiento para mostrar cadena con interrupción MASM
« Respuesta #3 en: Jueves 1 de Enero de 2009, 10:46 »
0
Una interrupcion la puede llamar cualquiera, por eso tu codigo tiene que residir en memoria (no ser descargado) y al ser descargado tiene que restaurar la interrupcion para que no se llame a un codigo que no existe mas en memoria.

http://en.wikipedia.org/wiki/Terminate_ ... y_Resident

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.