Здраствуйте! Это опять я со своими глупыми вопросами... Пытаюсь установить своё прерывание: DATA SEGMENT ...... ...... DATA ENDS STK SEGMENT STACK ;ñåãìåíò ñòåêà DB 128 DUP(?) STK ENDS CODE SEGMENT ;ñåãìåíò êîäà ASSUME DSATA,CS:CODE,SS:STK; ñâÿçóåì ðåãèñòðû ñ ñåãìåíòàìè Alarm Proc lea dx,Message1 mov ah,09h int 21h xor ax,ax int 16h iret Alarm ENDP START: MOV AX,DATA ;çàãðóæàåì â DS íà÷àëüíûé àäðåñ DATA MOV DS,AX mov ah,25h mov al,99h lea dx,Alarm int 21h int 99h MOV AX,4C00H INT 21H CODE ENDS END START Когда пытается выполнить int 99h NTVDM начинает ругаться. Стоит у меня Виста, на ХР тоже самое было.
При установке обработчика прерывания в dx помещается смещение, а в ds - сегмент обработчика. Про сегмент ты забыл.
Alarm находится к кодовом сегменте. Поэтому необходимо перед Код (Text): mov ah,25h mov al,99h lea dx,Alarm int 21h выполнить push DS push CS pop DS чтобы DSX-указывали на Аlarm.
А можешь не мудрить! ты же шаришь, что адрес обработчика прерывания лежит в таблице векторов! А она в 1024 байтах начальных, адрес обратотчика есть номер обработчика умножить на что? ))) Вот и меняй напрямую, этот трюк давно забытый, но в "Как написать вирус?" от И.Коваля там все это есть.
Нет, ну зачем так сразу человека расстраивать? Пусть бы посидел, помучился, там глядишь может проц и выполнил бы такую команду?! ))))
EvilsInterrupt Ну да, только сначала пришлось бы долго плясать с бубном, чтобы компилятор ее хотя бы откомпилировал
Great А че ему компилить то? сформировать походу а-ля db 0xХреновый_байт_опкода_раз, 0xХреновый_байт_опкода_два и так будет с каждым! - (c) Альтов )))
Есть такая команда!!! Ее код: 50 8C C8 8E D8 58 Ну а почему бы и нет? Ведь преобразовывали же ассемблеры еще под 8086 shl al, 2 -> 2x shl al, 1