будильник+запуск проги

Тема в разделе "WASM.ASSEMBLER", создана пользователем tower120, 23 май 2007.

  1. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Задача: Написать прогу, которая через определенный промежуток времени запускает другую прогу. Реализовать через будильник.
    Реализация:
    Код (Text):
    1. Code Segment
    2.     Assume CS:CODE, DS:CODE, SS:CODE
    3.     org 100h
    4.  
    5. .386
    6. Main proc
    7.     jmp Init
    8.     ;data
    9.                 FILENAME     DB   'D:\lab3d.exe',0  ;загружаем TRIAL.EXE
    10.             Seconds      DB   5h
    11.             Minutes      DB   0
    12.             Hours        DB   0
    13.    
    14.         PARAMETERS   DW   7 DUP(0)          ;нулевой блок параметров
    15.         KEEP_SS      DW   0                ;переменная для SS
    16.         KEEP_SP      DW   0                ;переменная для SP
    17.  
    18.     ;resident code
    19. Entry:
    20.     ;---перераспределение памяти
    21.                mov dx,(Init-Main+100h+0fh)/16
    22.        MOV   AH,4AH           ;номер функции
    23.        INT   21H              ;перераспределение
    24.     ;---указываем на блок параметров
    25.        MOV   AX,DS          ;в ES - сегмент
    26.        MOV   ES,AX                  ;
    27.        MOV   BX,OFFSET PARAMETERS   ;в BX - смещение
    28.     ;---сохранить копии SS и SP
    29.        MOV   KEEP_SS,SS       ;сохраняем SS
    30.        MOV   KEEP_SP,SP       ;сохраняем SP
    31.     ;---указываем на строку имени файла
    32.        MOV   DX,OFFSET FILENAME     ;смещение - в DX
    33.        MOV   DS,AX                  ;
    34.     ;---загрузка программы
    35.        MOV   AH,4BH           ;функция EXEC
    36.        MOV   AL,0             ;выбираем "загрузку и запуск"
    37.        INT   21H              ;запускаем задачу
    38.     ;---впоследствии, восстанавливаем регистры  
    39.        MOV   SS,KEEP_SS       ;восстанавливаем SS
    40.        MOV   SP,KEEP_SP       ;восстанавливаем SP
    41.  
    42.     iret
    43. Main endp
    44. init proc
    45. ;---замена прерывания---------------------------------
    46.    mov ah,25h
    47.    mov al,4ah
    48.    lea dx,Entry
    49.    int 21h
    50.  
    51. ;   int 4ah
    52. ;---сбрасываем будильник------------------------------
    53.    mov ah,07h
    54.    int 1ah  
    55. ;---устанавливаем будильник-------]--------------------
    56.    mov ah,06h
    57.    mov ch,hours
    58.    mov cl,minutes
    59.    mov dh,seconds
    60.    int 1ah
    61. ;---выгружаемся----------------------------------------  
    62.    mov ax,3100h
    63.    mov dx,(Init-Main+100h+0fh)/16
    64.    int 21h
    65. init endp
    66. Code ends
    67. end Main
    используем тег [ code ]!

    Не работает... И судя по всему не срабатывает будильник. Потому что просто вызов прерывания результативен. Люди добрые, помогите! Задача проще некуда, а столько мучаюсь!
     
  2. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Ну хоть рабочий примерчик установки будильника покажите! Горюююююю!!!!!
     
  3. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Попробуй проверять флаг CF после установки будильника. Если установлен, значит произошла ошибка.
    Ещё перед смелым вызовом DOS из обработчика прерывания, хорошо бы проверять её занятость. Посмотри описания INT 28h и INT21,AH=34H Возможно дело в этом.
     
  4. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    Я не знаю насколько я прав но у меня тема с
    mov ax,3100h
    mov dx,(Init-Main+100h+0fh)/16
    int 21h
    Еще не разу не срабатывала ...
    Может в винде дело не знаю...

    Касательно проги:
    На всякий п.. сбрось i флаг при входе в обработчик, может просто прерывания запрещены...
     
  5. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    To Vov4ick:
    Спасибо друг, сам разобрался. Я идиот, думал что нужно указывать время через которое срабатывает, а не в которое. И это при том что програмировал будильник в прошлом году на С++.
     
  6. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Меня NTVDM Вистовский только-что послал (на это время будильник был установлен). Так что работает.
     
  7. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Проверяй занятость DOS, и в обработчике неплохо бы все регистры сохранять и восстанавливать, а то работает программка какая-то, вдруг - раз - все регистры поменялись :-O
     
  8. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Мда... Из под TurboShell работает, но по завершению запущеной проги выдаёт сообщение Null Pointer Assignment. Из под ДОС вообще ничего не запускает, а точнее зависает.

    Код (Text):
    1. .model tiny
    2. .data
    3. org 100h
    4.  
    5. .386
    6. Main proc
    7.     jmp Init
    8.     ;data  
    9.    BUF       DB   255 DUP(0)       ;переменная для хранения
    10.         FILENAME     DB   'D:\lab3d.exe',0  ;загружаем TRIAL.EXE
    11.             Seconds      DB   17h
    12.             Minutes      DB   55h
    13.             Hours        DB   05h
    14.    
    15.         PARAMETERS   DW   7 DUP(0)          ;нулевой блок параметров
    16.         KEEP_SS      DW   0                ;переменная для SS
    17.         KEEP_SP      DW   0                ;переменная для SP
    18.        
    19.         Size         dw   0
    20.  
    21.     ;resident code
    22. Entry:
    23.   pusha
    24.    push es
    25.    push ds
    26.  
    27.    push cs
    28.    pop ds
    29.  
    30.     ;---указываем на блок параметров
    31.        MOV   AX,DS          ;в ES - сегмент
    32.        MOV   ES,AX                  ;
    33.        MOV   BX,OFFSET PARAMETERS   ;в BX - смещение
    34.     ;---сохранить копии SS и SP
    35.        MOV   KEEP_SS,SS       ;сохраняем SS
    36.        MOV   KEEP_SP,SP       ;сохраняем SP
    37.     ;---указываем на строку имени файла
    38.        MOV   DX,OFFSET FILENAME     ;смещение - в DX
    39.        MOV   DS,AX                  ;
    40.     ;---загрузка программы
    41.        MOV   AH,4BH           ;функция EXEC
    42.        MOV   AL,0             ;выбираем "загрузку и запуск"
    43.        INT   21H              ;запускаем задачу
    44.     ;---впоследствии, восстанавливаем регистры  
    45.        MOV   SS,KEEP_SS       ;восстанавливаем SS
    46.        MOV   SP,KEEP_SP       ;восстанавливаем SP
    47.  
    48.    pop ds
    49.    pop es
    50.    
    51.    popa
    52. iret
    53. Main endp
    54.  
    55.  
    56. init proc
    57. ;---замена прерывания---------------------------------
    58.    mov ah,25h
    59.    mov al,4ah
    60.    lea dx,Entry
    61.    int 21h
    62.  
    63. ;---сбрасываем будильник------------------------------
    64.    mov ah,07h
    65.    int 1ah  
    66. ;---устанавливаем будильник-------]--------------------
    67.    mov ah,06h
    68.    mov ch,hours
    69.    mov cl,minutes
    70.    mov dh,seconds
    71.    int 1ah
    72.  
    73. ;---выгружаемся----------------------------------------  
    74.    mov ax,3100h
    75.    mov dx,(Init-Main+100h+0fh)/16
    76.    mov Size,dx
    77.    int 21h
    78. init endp
    79.  
    80. Code ends
    81. end Main
    Может я что то не так делаю?
    Может сегменты не туда настроены? :)
    А памяти ведь достаточно? В смысле
     
  9. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Ты в [ES:BX] не помещаешь структуру с параметрами вызова. Посмотри описание функции.
     
  10. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Минуточку, а это что?
    Код (Text):
    1.              PARAMETERS   DW   7 DUP(0)          ;нулевой блок параметров
    2.              ...
    3.              ...
    4.     ;---указываем на блок параметров
    5.        MOV   AX,DS          ;в ES - сегмент
    6.        MOV   ES,AX                  ;
    7.        MOV   BX,OFFSET PARAMETERS   ;в BX - смещение
    Я не могу понять почему при запуске из TS все путем?
     
  11. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Пардон, не заметил.
    Меня ещё смутило отсутствие определения сегмента кода :derisive:
    Во-первых проверяй таки занятость DOS
    Во-вторых проверяй ошибку после вызова функции. Мне например сказали "Insufficient memory."
    Пробовал запускать программу не из обработчика прерывания? И проверять работу обработчика.
     
  12. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Как проверить занятость DOS?
    Ту прогу которую должОн запускать мой программ, я проверял - работает. Обработчик работает, если добавить выделение памяти (4ah). Я так понимаю после
    Код (Text):
    1.    mov ax,3100h
    2.    mov dx,(Init-Main+100h+0fh)/16
    3.    mov Size,dx
    4.    int 21h
    Память выделяется?

    Как посмотреть ошибку вызова ф-ии? Я ведь не смогу не вывести на экран, ни дебагером перехватить.
     
  13. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Не понял про выделение памяти (4ah)
    После функции запуска поставь jc error - как и во многих других функциях DOS. Код ошибки будет в AX.
    Зачем переменная size?
    Прочитай сообщения 3 и 7 :derisive: и скачай себе Ralph Brown interrupt list - нужная вещь, там всё написано.
     
  14. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Для запуска ещё одной проги нужна память. Оставаясь резидентными мы выделяем память. А для проверки работоспособности я просто выделил память ф-ией 4ah, а потом вызвал её.

    Это .com - Turbo Debugger не хочет видеть листинг, а без него плохо.
    ЭТО УЖАС! Как вообще в таком объёме инфы можно орентироваться в обычном FAR'e? Короче я не смог там найти int 28h. Гораздо удобнее на http://www.codenet.ru/progr/dos/, правда я так и не понял как ей пользоваться (в смысле int 28h).
     
  15. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Функция запуска сама выделяет память
    У меня всё нормально работает, часто пользуюсь TD.
    Я нормально ориентируюсь, правда в DN'е. :derisive: Просто используй поиск по файлу.
    Кривовато :-(
     
  16. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Ничего она не выделяет, если выделять нечего. А выделять не будет чего, если вся память нашей прогой занята (дефаулт).

    Я не могу посмотреть код ошибки, потому что в момент запуска другой проги NTVDM виснет намертво.
     
  17. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Ну не вся память прогой занята, а только один сегмент. NTVDM у меня тоже падает (при сжатии области памяти), а в DOS всё работает.
     
  18. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Моя прога работает? Правда? ::какой-то радостный смайлик::

    Пять минут спустя: А так ты об падении NTVDM. Не, у меня при сжатии памяти ничё не падает. :)
     
  19. tower120

    tower120 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    56
    Вобщем всем спасибо, особенно Вовчику! Сдал я эту прогу. Запускал из TS. Никто ничего не заметил :).