Проблема конечно не совсем актуальная но всё же. Мне не понятно, как получить правельный адрес строки в обработчике прерывания ДОС. Вот мой код: Код (Text): assume cs:codes codes segment para org(100h) main proc near jmp init old_09h: dd 0 fname: db 'some.txt$' ; текст, который мне нужен в обработчике x09h: ; собственно обработчик push ax push bx push cx push dx in al, 60h ; проверяем, нажата ли F12 cmp al, 58h jne dontdo ; если нет, то ничего не делаем mov ah, 9 ; а вот здесь зарыта собака... lea dx, byte ptr fname ; как бы я не пробовал обратиться к пасяти, нужную строку int 021h ; найти не могу... ; пробовал и word ptr cs:[fname+/-100h] ; и всякие другие изощрения (извращения), но результат один: ; получаю на экране неопознанный кусок памяти dontdo: pop dx pop cx pop bx pop ax jmp dword ptr cs:[old_09h] ex09h: ; конец обработчика init: ; инициализация mov ah, 9 ; для проверки вывожу в начале нужную строку mov dx, offset fname + 100h int 021h xor dx, dx ; дальше идёт замена стандартного 09 прерывания, на моё... mov ds, dx mov ax, ds:[09h*4] mov word ptr cs:[old_09h], ax mov ax, ds:[09h*4+2] mov word ptr cs:[old_09h+2], ax cli lea ax, x09h mov word ptr ds:[9h*4], ax push cs pop ax mov word ptr ds:[9h*4+2],ax sti lea dx, ex09h ; и выход с оставлением TSR int 027h main endp codes ends end main наверняка многие знают, что я делаю не так... помогите пожалуйста (всё на tasm'е)
Код (Text): push ds push cs ; ...вот здесь зарыта собака... pop ds ;--""-- mov ah, 9 ;оно всегда выводило то что находится в DS:DX lea dx, byte ptr fname int 021h pop ds
это я тоже пробовал уже, результат: Недопустимая операция cs:fe2e IP:1145 op:63 61 6e 20 4d есть у кого-нибудь ещё варианты?
Код (Text): xor ax, ax push ds mov ds, ax les di, dword ptr ds:[9h*4] ; es:di == old interrupt, save it! cli mov word ptr ds:[9h*4+0], cs mov word ptr ds:[9h*4+2], offset new_int9h sti pop ds возможно накосячил с установкой обработчика (тогда надо поменять местами cs и offset).
cha0s Тут вроде уже не раз писали об осторожности при вызове int 21h из обработчиков других прерываний.
Люди, извините, первый совет был правельный. Я бы ещё вчера всё правильно сделал и не задавал бы этот вопрос, если бы запускал прогу под досом, а не из под command.com в WinXP. =) можно сказать - тема закрыта...