169 похожих чатов

Добрый вечер. Есть резидентная программа под DOS 6.22, которая на

нажатие клавиши должна реагировать выводом строки, но где-то проваливаюсь в новом отладчике и происходит "повисание" системы.
С чем это может быть связано, помогите пожалуйста

.model tiny.code
ORG 100h
main:
jmp Init
New_09h proc
push ax ;Сохранить регистры в стек
push dx
push ds
push es
mov ax,cs
mov ds,ax
in al,60H ;читать ключ
cmp al,46h ;Если нажата клавиша 'ScrollLock'
je do_pop ;да, активизировать popup
pop es
pop ds
pop dx
pop ax ;нет, уйти на исходный обработчик
jmp dword ptr cs:[Old_09h]

do_pop: ;код отработки нажатия клавиши 'ScrollLock'
mov ah,09h
mov dx,offset HelloWorldMsg
int 21h
in al,61H ;взять значениe порта управления клавиатурой mov ah,al ;сохранить его
or al,80h ;установить бит разрешения для клавиатуры out 61H,al ;и вывести его в управляющий порт
xchg ah,al ;извлечь исходное значение порта
out 61H,al ;и записать его обратно
mov al,20H ;послать сигнал "конец прерывания"
out 20H,al ;контроллеру прерываний 8259
pushf
call dword ptr cs:[Old_09h]
pop es
pop ds
pop dx
pop ax
iret ;возврат из обработчика прерываний

HelloWorldMsg DB "Hello World!",13,10,"$"
Old_09h DD ? ;определение ячейки памяти для хранения адреса системного обработчика
New_09h endp

Init:
;получаем адрес текущего обработчика прерывания в регистрах ES и BX
mov ah,35h
mov al,09h
int 21h
mov word ptr Old_09h,bx
mov word ptr Old_09h+2,es

;запись стартового обработчика в вектор прерываний
mov ax,2509h
mov dx,offset New_09h
int 21h

;выводим сообщение о загрузке резидента в память
mov ah,09h
mov dx,offset InitMsg
int 21h

;возврат в DOS, оставшись резидентным
mov dx,offset Init
int 27h

InitMsg DB "Resident installed in memory!",13,10,"$"
end main

7 ответов

79 просмотров

1. запись стартового обработчика в вектор прерываний mov ax,2509h mov dx,offset New_09h int 21h Мне не нравиться что ты сохраняешь только смещение. А сегмент где? 2. call dword ptr cs:[Old_09h] А тепеь вызываешь по своему сегменту кода а не по ранее сохраненному сегменту

Agent
1. запись стартового обработчика в вектор прерыва...

Сегмент в ds, файл .com, cs=ds. А вот call очевидный баг, но не поэтому, а потому что старый обработчки сделает iret (6 байт со стека) вместо ret (2 байта со стека).

Agent
Вроде pushf есть и call far тоже

Да, ты прав. Тогда непонятно, что там ещё не так.

s54820
Да, ты прав. Тогда непонятно, что там ещё не так.

Там много странностей. Jmp на старый обработчик и внизу еще и call тудаже😁

Agent
Там много странностей. Jmp на старый обработчик и ...

Ну это вроде ок, перед джампом все чистится, после call вроде тоже.

s54820
Ну это вроде ок, перед джампом все чистится, после...

Да но логически гепонТно почему в одном случае одно а во втором другое

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта