На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> 2 7in: Int 9h не ПАШЕТ ?!?!
    Слушай, не знаю откуда у меня руки растут,
    но винда виснет по страшной силе когда я
    int 9h переопределяю.
    Если тебе не в лом, напиши полностью прогу которая
    весится на 9-е прерывание и при нажатии любой клавиши
    выводит ее на экран, а при нажатии 'e' - возвращает в
    таблицу прерываний старое значение вектора... Да, прога
    должна быть TSR.
    Ну а если тебе все-таки влом, то хоть подскажи че-нибудь.
      Вот оно...
      Компилить (COM-файл):
      TASM int9.asm /m2
      TLINK int9.obj /x /t
      При нажатии 'e' прога восстанавливает адрес старого обработчика, но память не освобождает. Т.е. прога так и будет висеть в памяти (только уже бессмысленно).
      .MODEL Tiny
      .286
      .CODE
      ORG 100h
      Start:
      jmp SetIntVec
      OldInt DD ? ; Адрес старого обработчика
      Handler:
      push ax cx si di es
      in al,60h ; Читаем Scan-код клавиши
      cmp al,12h ; Scan-код клавиши 'e'
      je SetOldInt ; Если нажата 'e', то идти на SetOldInt
      or al,al ; Устанавливаем или сбрасываем флаги
      lea si,PressMsg
      jns Press ; Прыгаем, если флаг SF=1 (AL >= 80h, т.е. клавиша отпущена)
      lea si,ReleaseMsg
      Press: and al,7Fh ; Чтобы код клавиши был < 80h
      push ax
      mov ax,0B800h
      mov es,ax
      xor di,di ; ES:DI = Видеопамять
      mov cx,Len
      cld
      mov ah,15 ; Цвет
      NextChar: lods BYTE PTR cs:[si]
      stosw ; Копируем текст в видеопамять
      loop NextChar
      pop cx
      mov al,cl
      shr al,4 ; AL = Старшая цифра
      call PrintDigit ; Выводим цифру
      mov al,cl
      and al,0Fh ; AL = Младшая цифра
      call PrintDigit ; Выводим цифру
      Exit:
      pop es di si cx ax
      pushf
      call cs:OldInt ; Вызываем старый обработчик Int 9
      iret ; Выходим
      SetOldInt:
      xor ax,ax
      mov es,ax ; ES = Таблица прерываний
      mov ax,WORD PTR cs:OldInt[0]
      mov es:[9*4+0],ax ; Восстанавливаем смещение старого обработчика
      mov ax,WORD PTR cs:OldInt[2]
      mov es:[9*4+2],ax ; Восстанавливаем сегмент старого обработчика
      jmp Exit ; Все на выход!!!
      PressMsg DB 'Нажата клавиша с кодом: '
      Len = $-PressMsg
      ReleaseMsg DB 'Отпущ. клавиша с кодом: '
      ; Вывод цифры в AL
      PrintDigit proc
      add al,'0' ; ...
      cmp al,'9' ; ...
      jbe Ok ; ...
      add al,'A'-('9'+1) ; Преобразуем в HEX-цифру
      Ok: stosw ; Выводим цифру
      ret
      PrintDigit endp

      SetIntVec:
      mov ax,3509h
      int 21h ; Получаем адрес старого обработчика
      mov WORD PTR OldInt[0],bx
      mov WORD PTR OldInt[2],es
      mov ah,25h
      lea dx,Handler
      int 21h ; Устанавливаем новый обработчик
      mov ah,49h ; Советую вот эту штуку делать,
      mov es,ds:[2Ch] ; если не используешь Environment
      int 21h ; (лишнюю память освобождаешь)
      lea dx,SetIntVec
      int 27h ; Вешаемся как TSR
      END Start
        Сенькю вери мач :))
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0511 ]   [ 16 queries used ]   [ Generated: 20.04.24, 00:45 GMT ]