Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему некорректно завершается программа? 
:(
    Опции темы
GQU
Дата 11.1.2015, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Почему некорректно завершается программа?
Код


CSEG segment
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
org 100h

Begin:
       jmp Init ;На метку инициализации 


; === Процедура обработки 10h прерывания ===
Int_10h_proc proc
      pushf ;Сохраним флаги в стеке, т.к. они поменяются...

      cmp ax,8899h    ;Проверим на повторную загрузку в память (см. ниже)
      ;jne Next_test    ;Если не проверка, то смотрим дальше... 

      xchg ah,al    ;Меняем местами AH и AL (признак того, что мы в памяти
            ;что-то вроде ответного сигнала)
      popf  ;Выровним стек
      iret  ;Выйдем из прерывания (вернемся в нашу программу)
            ;AX теперь равен 9988h !!!


Int_10h_vect dd ? ;Здесь хранится адрес оргинального обработчика
Int_10h_proc endp


; ===============================================================
; Инициализация (подготовка и настройка резидента)
Init:
       mov ax,8899h ;Проверим, в памяти ли мы уже или еще нет
       int 10h      ;8899h - наш позывной
       cmp ax,9988h ;Отозвался обработчик (AH/AL должены поменяться местами)?
       jne Set_resident

       mov ah,9        ;Если в памяти, то выведем соответствующее сообщение
       mov dx,offset In_memory ;Зачем нас двое в памяти?
       int 21h

       ret        ;...И вернемся в DOS


Set_resident:        ;Если нас в памяти нет, то установим резидент
       mov ax,3510h
       int 21h        ;Получим и сохраним адрес (вектор) 10h прерывания
       mov word ptr Int_10h_vect,bx    ;Вначале младшее слово (смещение)
       mov word ptr Int_10h_vect+2,es    ;Затем старшее (сегмент)

       mov ax,2510h
       mov dx,offset Int_10h_proc
       int 21h        ;"Повесим" нашу процедуру на 10h прерывание

       mov dx,offset Init
       int 27h        ;Оставим программу резидентной в памяти.    

In_memory db 'Мы уже в памяти!!!!$'

CSEG ends
end Begin

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.