Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2011, 15:53   #1
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию Зависание приложения при запуске

Код:
s SEGMENT STACK         ; сегмент стека
     DB 128 DUP(?)
 s ENDS

 d SEGMENT               ; сегмент данных
     COUNTER DW 201
     OLD_TIMER DD ?
 d ENDS 

 code SEGMENT            ; сегмент кода
     ASSUME SS:s,DS:d,CS:code

  ; выводит целое число. число передается в регистре AX
  OUT_DEC PROC
        PUSH BX         ; сохраняем используемые регистры в стеке
        PUSH CX
        PUSH DX

        MOV BX, 10      ; будем делить число на 10, чтобы выделить цифры
        XOR CX, CX
  NOT_ZERO:             ; начинаем выделять цифры числа
        XOR DX, DX
        DIV BX          ; ax = (dx, ax) div 10 ; dx = (dx, ax) mod 10
        PUSH DX         ; записываем в стек цифры
        INC CX
        CMP AX, 0
        JNE NOT_ZERO
        MOV AH, 2
  WRITE_DIGIT_LOOP:
        POP DX          ; читаем цифры из стека, начиная с первой
        ADD DL, '0'
        INT 21h         ; печатаем цифры
        LOOP WRITE_DIGIT_LOOP

        POP DX          ; восстанавливаем использованные регистры из стека
        POP CX
        POP BX
        RET
  OUT_DEC ENDP

  ; новый обработчик прерывания таймера
  TIMER PROC
      PUSH AX         ; сохраняем используемые регистры в стеке 
      PUSH DS

      MOV AX, d
      MOV DS, AX      ; загрузка сегментного регистра ds
      DEC COUNTER     ; уменьшаем счетчик на 1
      MOV AX, COUNTER  
      CALL OUT_DEC    ; выводим значение счетчика
      MOV AH, 2   
      MOV DL, ' '     
      INT 21h         ; выводим пробел

      POP DS          ; восстанавливаем использованные регистры из стека
      POP AX
  ADR_INT:
      JMP OLD_TIMER   ; вызываем старый обработчик прерывания таймера
  TIMER ENDP

 start:
     MOV AX, d
     MOV DS, AX     ; загрузка сегментного регистра ds

     MOV AX, 03508h ; читаем адрес старой процедуры обработки прерывания таймера
     INT 21h
     MOV WORD PTR OLD_TIMER, BX ; сохраняем этот адрес в переменной OLD_TIMER
     MOV WORD PTR OLD_TIMER + 2, ES

     PUSH DS
     MOV AX, code ; записываем адрес новой процедуры обработки прерывания таймера
     MOV DS, AX
     MOV DX, OFFSET TIMER
     MOV AX, 02508h
     INT 21h
     POP DS

 CMP_COUNTER:
     CMP COUNTER, 0      ; ждем, когда счетчик уменьшится до нуля
     JNZ CMP_COUNTER

     PUSH DS
     MOV DS, WORD PTR OLD_TIMER + 2
     MOV DX, WORD PTR OLD_TIMER ; восстанавливаем адрес старой процедуры
     MOV AX, 02508h             ; обработки прерывания таймера
     INT 21h
     POP DS

     MOV AH,4Ch
     INT 21h         ; выходим из программы
 code ENDS

 END start
Программа считает от 200 до 0 через прерывания таймера. Вобщем собрал её через TASM TLINK но при запуске просто зависает командная строка
Lazio вне форума Ответить с цитированием
Старый 16.05.2011, 16:58   #2
UsamaBenLadan
Пользователь
 
Аватар для UsamaBenLadan
 
Регистрация: 01.05.2011
Сообщений: 23
По умолчанию

Вывод на экран лучше вынести из обработчика прерываний
Зависало скорее всего здесь JMP CS:OLD_TIMER (не было префикса CS)
Код:
; сегмент кода
OLD_TIMER DD ?
flag DB 0

  TIMER PROC
     MOV [CS:flag],1
     JMP CS:OLD_TIMER   ; вызываем старый обработчик прерывания таймера
  TIMER ENDP

....

 CMP_COUNTER:
      CMP COUNTER, 0      ; ждем, когда счетчик уменьшится до нуля
      JE EXIT_PROG
      CMP [flag],0
      JE CMP_COUNTER
      MOV AX, COUNTER  
      CALL OUT_DEC    ; выводим значение счетчика
      MOV AH, 2   
      MOV DL, ' '     
      INT 21h         ; выводим пробел
      MOV [flag],0
      DEC COUNTER
      JMP CMP_COUNTER
EXIT_PROG:
UsamaBenLadan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Label при запуске приложения текст теряется pavellyba Общие вопросы Delphi 4 04.04.2011 00:44
Google Chrome временное зависание системы при запуске браузера CRAZY26 Помощь студентам 2 23.11.2010 13:57
Скрыть форму при запуске приложения PHP&DELPHI_User Общие вопросы Delphi 12 12.10.2010 16:06
Не привязанный прогресс при запуске приложения altcore Общие вопросы Delphi 28 03.08.2010 00:44
Ошибка при запуске приложения -=pasha=- Общие вопросы Delphi 10 07.07.2010 13:46