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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2011, 19:13   #1
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию Запуск дос-приложений под виндовс.

Собрал свои проекты под дос (на вирт машине), под ним они виснут намертво. Перенес на винду всё работает отлично. Так в чем же различия в выполнении на Досе и командной строке винды?
Lazio вне форума Ответить с цитированием
Старый 13.05.2011, 19:23   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,710
По умолчанию

Во многом. Хотя бы в том, что в виндосе только эмулятора доса.
p51x вне форума Ответить с цитированием
Старый 13.05.2011, 20:04   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
под ним они виснут намертво.
Может стоит не операционку подбирать а проверить код чтоб не висло?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.05.2011, 03:12   #4
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Не все то дос, что командная срока, а стало быть налицо ошибки в проекте в сроках No 64, 42.. и попробуй переустановить виндовс- должно помочь.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 14.05.2011, 12:06   #5
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию

скажем так. есть приложение которые выполняется под вирт. машиной на асме. работает с памятью. на командной строке винды работает норм, а в вирт машине просто ложит её с сообщением о том что работа приостановлена и т д
Lazio вне форума Ответить с цитированием
Старый 14.05.2011, 12:22   #6
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 и выводит на экран. В досе тупо не начиная ничего выводить виснет
Lazio вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Змейка на с++ под мс-дос Banner Помощь студентам 0 01.04.2011 22:09
запуск игр на виндовс 7 andrey3229 Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 27.08.2010 17:46
Си под Дос. Массивы Zid@ne Общие вопросы C/C++ 6 23.12.2008 16:55
Массивы структур.СИ под ДОС. Zid@ne Общие вопросы C/C++ 2 12.12.2008 18:16
Сделать чтобы оболочкой программы был не ДОС а нормальное окно виндовс Артэс Общие вопросы C/C++ 7 12.06.2007 12:11