Programación General > ASM (Ensamblador)

 Procedimiento para mostrar cadena con interrupción MASM

(1/1)

Malik:
Hola, tengo este código:


--- Código: Text ---                 dosseg                .model small                .stack 100h                .datacadena          db  "Hola que tal$"                .codemuestra         proc                lea dx, cadena                mov ah, 09h                int 21                iretmuestra         endp inicio:         mov ax, @data                mov ds, ax                ;cargar vector interrupcion                ;int 21h Función ah=25h  al=tipo int ds:dx rutina int                mov al, 52h                mov dx, offset muestra                mov bx, seg muestra                mov ds, bx                mov ah, 25h                int 21h                                ;Ejecuta procedimiento                int 52h                                ;devuelve el control al dos                mov ah, 4ch                int 21h                end inicio  
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:
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 ...

Malik:
Gracias Eternal Idol :good:

os pongo el código funcionando:


--- Código: Text ---                 dosseg                .model small                .stack 100h                .datacadena          db  "Hola que tal$"                 .codemuestra         proc                lea dx, cadena                mov ah, 09h                int 21h                iretmuestra         endp inicio:         mov ax, @data                mov ds, ax                ;cargar vector interrupcion                ;int 21h Función ah=25h  al=tipo int ds:dx rutina int                push ds                mov al, 52h                mov dx, offset muestra                mov bx, seg muestra                mov ds, bx                mov ah, 25h                int 21h                pop ds                                ;Ejecuta procedimiento                int 52h                                ;devuelve el control al dos                mov ah, 4ch                int 21h                end inicio  

--- Cita de: "Eternal Idol" ---PD. Despues esta el tema de que tu codigo no es residente y no restauras el vector de interrupcion original ...
--- Fin de la cita ---
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:
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

Navegación

[0] Índice de Mensajes

Ir a la versión completa