Почему при вызове функции 4ch прерывания 21h резидентный обработчик падает?

Написал резидентную программу, всё работает, но если моя или другие программы вызывают функцию 4ch прерывания 21h, консоль перестаёт реагировать на нажатия, хотя курсор мигает. Мне нужно вызывать эту функцию для выхода из копии программы при повторном запуске. Также, если после загрузки вызываю программу mem, то консоль перестаёт реагировать на нажатия, хотя курсор мигает. Скорее всего это связано с заменой вектора прерываний, но вот что именно не так, поянять не могу. Буду благодарен за помощь.
code segment
  old_int09 dd 0
  old_int2Fh dd 0
  message1 db "Programm already runs", 10, '$'
  message2 db "Programm unloaded", 10, '$'
  assume cs: code
  jmp start

  new_int2Fh  proc  far
    cmp ax,0FF00h
    jz installed
    jmp dword ptr cs:old_int2Fh
    installed:
    mov ax,00FFh
    iret
  new_int2Fh  endp

  new_int09h proc
    pushf
    call old_int09
    pushf
    push ax
    push dx
    push bx
    push cx
    push si
    push ds

    mov ah, 01h
    int 16h
    cmp al, 24
    je write_data
    cmp al, 19
    je unload
    jmp return

    write_data:
    push 0f000h
    pop ds
    mov ah, 02h
    mov bx, 0e00eh
    mov cx, 103
    mov si, 0
    write_hex:
    cmp byte ptr [bx][si], 0
    je continue1
    mov dl, [bx][si]
    call write_byte
    continue1:
    inc si
    loop write_hex
    call new_line
    call new_line
    mov cx, 103
    mov si, 0
    write:
    cmp byte ptr [bx][si], 0
    je continue2
    mov dl, [bx][si]
    int 21h
    continue2:
    inc si
    loop write
    call new_line
    mov ah, 00h
    int 16h
    jmp return

    unload:
    mov ah, 00h
    int 16h
    mov ax, 2509h
    mov dx, word ptr old_int09
    mov ds, word ptr old_int09+2
    int 21h
    mov ax, 252fh
    mov dx, word ptr old_int2Fh
    mov ds, word ptr old_int2Fh+2
    int 21h
    mov ah, 09h
    push cs
    pop ds
    mov dx, offset message2
    int 21h
    mov ax, 04c00h
    int 21h
    return:
    pop ds
    pop si
    pop cx
    pop bx
    pop dx
    pop ax
    popf
    iret
    new_int09h endp
start:
  main proc far
    mov ax, 0FF00h
    int 2Fh
    cmp ax, 00FFh
    jne first_start
    mov ah, 09h
    push cs
    pop ds
    mov dx, offset message1
    int 21h
    mov ax, 4c00h
    int 21h

    first_start:
    push cs
    pop ds
    mov ax, 3509h
    int 21h
    mov word ptr old_int09, bx
    mov word ptr old_int09+2, es
    mov ax, 2509h
    mov dx, offset new_int09h
    int 21h
    mov ax, 352fh
    int 21h
    mov word ptr old_int2Fh, bx
    mov word ptr old_int2Fh+2, es
    mov ax, 252fh
    mov dx, offset new_int2Fh
    int 21h

    mov dx, (start - new_int09h +0fh)/16
    mov ah, 31h
    int 21h
  main endp

write_byte proc
    push ax
    push cx
    push dx
    mov ah, 02h
    mov cx, 2
    mov dh, dl
    shr dh, 4
    and dl, 0fh
    xchg dl, dh
    push dx
    write_sign:
    cmp cx, 1
    jne second_sign
    pop dx
    shr dx, 8
    second_sign:
    cmp dl, 9
    jle number
    add dl, 7
    number:
    add dl, '0'
    int 21h
    loop write_sign
    mov dl, ' '
    int 21h
    pop dx
    pop cx
    pop ax
    ret
write_byte endp

new_line proc
    mov ah, 02h
    mov dl, 10
    int 21h
    ret
new_line endp

code ends
end start
  • Вопрос задан
  • 597 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
mov dx, (start - new_int09h +0fh)/16

А почему такой размер резервируемой памяти? Это exe или com?
У вас есть функции, вызываемые из резидентной части, лежащие после start:
write_data портит ds.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
А под какой ОС запускаете?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы