СОМ-Программа работает через раз

Тема в разделе "WASM.BEGINNERS", создана пользователем 4y4z, 4 янв 2009.

  1. 4y4z

    4y4z New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    4
    Начав изучать ассемблер по книге Калашникова "Ассемблер это просто" перепечатал вот эту программку (MASM 6.11):
    Код (Text):
    1. CSEG segment
    2.  
    3. assume cs: CSEG, es:CSEG, ss:CSEG
    4.  
    5. org 100h
    6.  
    7. Begin:
    8. call Wait_key
    9. cmp al,27
    10. je Quit_prog
    11. cmp al,0
    12. je Begin
    13.  
    14. call Out_char
    15. jmp Begin
    16.  
    17. Quit_prog:
    18. mov al,32
    19.  
    20. call Out_char
    21. int 20h
    22.  
    23. Wait_key proc
    24. mov ah,10h
    25. int 16h
    26. ret
    27. Wait_key endp
    28.  
    29.  
    30. Out_char proc
    31. push cx
    32. push ax
    33. push es
    34.  
    35. push ax
    36. mov ax,0B800h
    37. mov es,ax
    38. mov di,0
    39. mov cx,2000
    40. pop ax
    41. mov ah,31
    42.  
    43. Next_sym:
    44. mov es:[di],ax
    45. inc di
    46. inc di
    47. loop Next_sym
    48.  
    49. pop es
    50. pop ax
    51. pop cx
    52. ret
    53. Out_char endp
    54.  
    55. CSEG ends
    56. end Begin
    Программа считывает введенный с клавиатуры символ и если это не клавиша Esc, то экран закрашивается синим цветом и заполняется введенными символами. При запуске программа не обрабатывает ничего кроме нажатия клавиши Esc и по ее нажатию завершает работу. Если после этого программу прогнать через отладчик (afdpro), а затем запустить программу из командной строки, то программа работает. Чем это можно объяснить?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    4y4z
    Добавь
    Код (Text):
    1. Begin:
    2. mov ah,0Fh  ;; ++
    3. int 10h     ;; ++
    4. call Wait_key
     
  3. 4y4z

    4y4z New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    4
    Работает!!!

    Правильно ли я понимаю что добавляется int 10,F для запроса текущего видеорежима?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    4y4z
    > добавляется int 10,F для запроса текущего видеорежима?
    Если в буквальном смысле, то да, а вообще не для этого. Цель этой добавки оповестить win'ду, что программа не будет работать "молча" и не будет просто заниматься вводом/выводом с/на консоли(ль), а что ей (программе) нужно "более dos'явое" окно. Подробностей я не знаю, просто однажды столкнулся с такой ситуацией, методом тыка определил, что достаточно вызвать что-нибудь из int 10h, а самое безобидное - это 0Fh. До сих пор (xpsp3) это срабатывает.

    Выполнять этот код не обязательно на каждой итерации цикла. Достаточно одного раза вначале работы программы, т.е. правильнее сделать так
    Код (Text):
    1. ...
    2. Begin0:
    3. mov ah,0Fh
    4. int 10h
    5. Begin:
    6. call Wait_key
    7. ...
    8. end Begin0
     
  5. 4y4z

    4y4z New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2009
    Сообщения:
    4
    А в книжке об этом ни слова. Преподаватель так вообще сказал, что у меня в коде ошибка.