Видеоэффект в текстовом режиме - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите пожалуйста с программой. Задание такое: написать программу, которая выводит на экран (на экране 25 строк и 80 столбцов) содержимое текстового файла, имя которого задано в командной строке. затем после нажатия клавиши Enter начинает удалять с экрана сначала крайние столбцы потом верхние и нижние строки, пока текст не исчезнет. Потом текст начинает разворачиваться в обратном порядке. Пытаюсь разобраться как реализовать вот эту часть задания: после нажатия клавиши Enter начинает удалять с экрана сначала крайние столбцы потом верхние и нижние строки, пока текст не исчезнет. Потом текст начинает разворачиваться в обратном порядке. Только начали изучать ассемблер, поэтому плохо понимаю как все это нужно сделать, как работать с памятью. Наверное чтобы удалить столбец надо поместить первый символ, с которого начинается строка в стек, затем переместить указатель на конец строки и переместить последний символ в регистр, перейти на другую строку, снова переместить первый символ и так до последней строки. Потом мы окажемся в конце текста, удаляем последнюю строку полностью двигаясь справа налево, перемещаем указатель на первую строку и удаляем ее и так далее. Когда текст исчезнет нужно будет все, что удалили, достать из стека. Использовать наверное нужно команды stos, lods и префикс rep. Но как это все написать на ассемблере? Все что есть у меня : открыть файл, имя которого введено пользователем в командной строке, и вывести на экран содержимое файла
Листинг программы
  1. .model small
  2. .stack 100h
  3. ; Данные
  4. .data
  5. mes db "Vvedite imya faila:$"
  6. CR EQU 13
  7. LF EQU 10
  8. Handler DW ? ;резервируем место для хранения номера файла
  9. Filename DB "file.txt",0
  10. ErrorStr1 DB 13,10,'Error1','$'
  11. ErrorStr2 DB 13,10,'Error2','$'
  12. BufIn DB 4500 dup (" ") ; буфер ввода
  13. .code
  14. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  15. print_letter macro letter
  16. push AX
  17. push DX
  18. mov DL, letter
  19. mov AH, 02
  20. int 21h
  21. pop DX
  22. pop AX
  23. endm
  24. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  25. start:
  26. mov ax,@data ; установка в ds адpеса
  27. mov ds,ax ; сегмента данных
  28. print_letter CR ; переход на новую строку
  29. print_letter LF
  30. mov ah, 9
  31. mov dx, offset mes
  32. int 21h
  33. ; функция ввода имени файла с клавиатуры
  34. MOV AH,0AH ;Запрос функции ввода
  35. LEA DX, [buf] ;Загрузить адрес списка параметров ; mov DX, offset buf
  36. INT 21H
  37. print_letter CR ; переход на новую строку
  38. print_letter LF
  39. xor BH, BH
  40. mov BL, buf[1]
  41. mov buf[BX+2], 0
  42. ;----------------------------------------------------------------открываем файл
  43. MOV AH, 3D02h ; функция OPEN
  44. mov dx,offset buf+2
  45. INT 21h
  46. jc Error1 ; проверить флаг
  47. MOV Handler, AX ;сохраняем номер файла
  48. print_letter CR
  49. print_letter LF
  50. ;------------------------------------------------------------------чтение
  51. MOV AH, 3Fh ; Функция READ
  52. MOV BX, Handler
  53. mov DX,offset buf+2
  54. mov CX, 4500
  55. INT 21H
  56. jc Error2 ; проверить флаг
  57. MOV CX, AX ; сколько реально прочитано
  58. ;------------------------------------------------------------------Вывод прочитанного на экран
  59. MOV AH, 40h ; функция WRITE
  60. MOV BX, 1 ; Дескриптор стандартного вывода
  61. MOV DX, OFFSET buf+2 ; отсюда выводить (СХ байт)
  62. Int 21h
  63. ;------------------------------------------------------------------закрываем файл
  64. mov ah,3Eh
  65. mov bx, Handler
  66. int 21h ;Файл закрыт
  67. Out_prog:
  68. mov ah,9
  69. int 21h ;выводим строку
  70. Exit:
  71. mov ah,04Ch
  72. mov al, 0
  73. int 21h
  74. Error1:
  75. mov dx,OFFSET ErrorStr1
  76. jmp out_prog
  77. Error2:
  78. mov dx,OFFSET ErrorStr2
  79. jmp out_prog
  80. END start

Решение задачи: «Видеоэффект в текстовом режиме»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.  
  9.         DelayTime       dd      30*1000        ;время задержки 30 мс
  10.  
  11. .code
  12.  
  13. ;Задержка - программа приостанавливает своё выполнение на некоторое время
  14. ;вход:
  15. ; DelayTime - глобальная переменная, время задержки в мкс.
  16. ;выход:
  17. ; нет
  18. Delay           proc
  19.         push    ax
  20.         push    cx
  21.         push    dx
  22.         mov     ah,     86h
  23.         mov     al,     00h
  24.         mov     dx,     word ptr DelayTime
  25.         mov     cx,     word ptr DelayTime+2
  26.         int     15h
  27.         pop     dx
  28.         pop     cx
  29.         pop     ax
  30.         ret
  31. Delay           endp
  32.  
  33. ;Заполнение экрана
  34. ;вход:
  35. ; нет
  36. ;выход:
  37. ; нет
  38. FillScreen      proc
  39.         push    es
  40.         push    ax
  41.         push    cx
  42.         push    di
  43.  
  44.         mov     ax,     0B800h
  45.         mov     es,     ax
  46.  
  47.         mov     di,     0
  48.         mov     cx,     80*25
  49.         mov     ax,     ('*')+7*256
  50.  
  51.         rep     stosw
  52.  
  53.         pop     di
  54.         pop     cx
  55.         pop     ax
  56.         pop     es
  57.         ret
  58. FillScreen      endp
  59.  
  60. ;Устанавливает атрибуты подстроки в строке на экране
  61. ;вход:
  62. ; ah - новый атрибут
  63. ; di - номер строки (от 0)
  64. ; bx - номер начального для смены атрибута символа в строке (от 0)
  65. ; cx - количество символов
  66. ; es - сегмент видеобуфера
  67. ;выход:
  68. ; нет
  69. SetAttrRow      proc
  70.         push    cx
  71.         push    dx
  72.         push    di
  73.         ;вычисление смещения начального символа подстроки в видеобуфере
  74.         push    ax
  75.         mov     ax,     80*2
  76.         mul     di
  77.         mov     di,     ax
  78.         add     di,     bx
  79.         add     di,     bx
  80.         add     di,     1
  81.         pop     ax
  82. @@SetAttr:
  83.         mov     es:[di],ah      ;запись нового атрибута
  84.         add     di,     2       ;переход к следующему символу
  85.         dec     cx
  86.         jnz     @@SetAttr
  87.  
  88.         pop     di
  89.         pop     dx
  90.         pop     cx
  91.         ret
  92. SetAttrRow      endp
  93.  
  94. ;Устанавливает атрибуты подстроки в столбце на экране
  95. ;вход:
  96. ; ah - новый атрибут
  97. ; di - номер столбца (от 0)
  98. ; bx - номер начального для смены атрибута символа в столбцке (от 0)
  99. ; cx - количество символов
  100. ; es - сегмент видеобуфера
  101. ;выход:
  102. ; нет
  103. SetAttrCol      proc
  104.         push    cx
  105.         push    dx
  106.         push    di
  107.         ;вычисление смещения начального символа подстроки в видеобуфере
  108.         push    ax
  109.         mov     ax,     80*2
  110.         mul     bx
  111.         add     di,     di
  112.         add     di,     ax
  113.         add     di,     1
  114.         pop     ax
  115. @@SetAttr:
  116.         mov     es:[di],ah      ;запись нового атрибута
  117.         add     di,     80*2    ;переход к следующему символу
  118.         dec     cx
  119.         jnz     @@SetAttr
  120.  
  121.         pop     di
  122.         pop     dx
  123.         pop     cx
  124.         ret
  125. SetAttrCol      endp
  126.  
  127. ;Скрывает текст на экране, делая буквы чёрными на чёрном фоне
  128. ;вход:
  129. ; нет
  130. ;выход:
  131. ; нет
  132. HideScreen      proc
  133.         push    ax
  134.         push    bx
  135.         push    cx
  136.         push    di
  137.         push    es
  138.  
  139.         mov     ax,     0B800h  ;es - сегмент видеобуфера
  140.         mov     es,     ax
  141.  
  142.         mov     bx,     0       ;номер (от 0) удаляемой строки
  143.  
  144.         mov     ax,     0       ;атрибут символа
  145.  
  146. @@HideText:
  147.         ;сокрытие символов левого столбца
  148.         mov     ah,     ah      ;атрибут
  149.         mov     di,     bx      ;номер столбца
  150.         mov     bx,     bx      ;номер начального символа в столбце
  151.         mov     cx,     25      ;количество символов в столбце
  152.         sub     cx,     bx
  153.         sub     cx,     bx
  154.         call    SetAttrCol
  155.         ;сокрытие символов правого столбца
  156.         mov     ah,     ah      ;атрибут
  157.         mov     di,     79      ;номер столбца
  158.         sub     di,     bx
  159.         mov     bx,     bx      ;номер начального символа в столбце
  160.         mov     cx,     25      ;количество символов в столбце
  161.         sub     cx,     bx
  162.         sub     cx,     bx
  163.         call    SetAttrCol
  164.         ;пауза
  165.         call    Delay
  166.         ;сокрытие символов верхней строки
  167.         mov     ah,     ah      ;атрибут
  168.         mov     di,     bx      ;номер строки
  169.         mov     bx,     bx      ;номер начального символа в строке
  170.         mov     cx,     80      ;количество символов в строке
  171.         sub     cx,     bx
  172.         sub     cx,     bx
  173.         call    SetAttrRow
  174.         ;сокрытие символов нижней строки
  175.         mov     ah,     ah      ;атрибут
  176.         mov     di,     24      ;номер строки
  177.         sub     di,     bx
  178.         mov     bx,     bx      ;номер начального символа в строке
  179.         mov     cx,     80      ;количество символов в строке
  180.         sub     cx,     bx
  181.         sub     cx,     bx
  182.         call    SetAttrRow
  183.         ;пауза
  184.         call    Delay
  185.         ;переход к следующему столбцу и строке
  186.         inc     bx
  187.         cmp     bx,     25/2
  188.         ja      @@Exit          ;если все строки рассмотрены - выйти
  189.  
  190.         jmp     @@HideText
  191.  
  192. @@Exit:
  193.         pop     es
  194.         pop     di
  195.         pop     cx
  196.         pop     bx
  197.         pop     ax
  198.         ret
  199. HideScreen      endp
  200.  
  201. ;Восстанавливает текст на экране, делая буквы белыми на чёрном фоне
  202. ;вход:
  203. ; нет
  204. ;выход:
  205. ; нет
  206. RestoreScreen   proc
  207.         push    ax
  208.         push    bx
  209.         push    cx
  210.         push    di
  211.         push    es
  212.  
  213.         mov     ax,     0B800h  ;es - сегмент видеобуфера
  214.         mov     es,     ax
  215.  
  216.         mov     bx,     25/2    ;номер (от 0) удаляемой строки
  217.  
  218.         mov     ah,     07h     ;атрибут символа
  219.  
  220. @@RestoreText:
  221.         ;восстановление атрибутов символов верхней строки
  222.         mov     ah,     ah      ;атрибут
  223.         mov     di,     bx      ;номер строки
  224.         mov     bx,     bx      ;номер начального символа в строке
  225.         mov     cx,     80      ;количество символов в строке
  226.         sub     cx,     bx
  227.         sub     cx,     bx
  228.         call    SetAttrRow
  229.         ;восстановление атрибутов символов нижней строки
  230.         mov     ah,     ah      ;атрибут
  231.         mov     di,     24      ;номер строки
  232.         sub     di,     bx
  233.         mov     bx,     bx      ;номер начального символа в строке
  234.         mov     cx,     80      ;количество символов в строке
  235.         sub     cx,     bx
  236.         sub     cx,     bx
  237.         call    SetAttrRow
  238.         ;пауза
  239.         call    Delay
  240.         ;восстановление атрибутов символов левого столбца
  241.         mov     ah,     ah      ;атрибут
  242.         mov     di,     bx      ;номер столбца
  243.         mov     bx,     bx      ;номер начального символа в столбце
  244.         mov     cx,     25      ;количество символов в столбце
  245.         sub     cx,     bx
  246.         sub     cx,     bx
  247.         call    SetAttrCol
  248.         ;восстановление атрибутов символов правого столбца
  249.         mov     ah,     ah      ;атрибут
  250.         mov     di,     79      ;номер столбца
  251.         sub     di,     bx
  252.         mov     bx,     bx      ;номер начального символа в столбце
  253.         mov     cx,     25      ;количество символов в столбце
  254.         sub     cx,     bx
  255.         sub     cx,     bx
  256.         call    SetAttrCol
  257.         ;пауза
  258.         call    Delay
  259.         ;переход к следующему столбцу и строке
  260.         test    bx,     bx
  261.         jz      @@Exit          ;если все столбцы рассмотрены - выйти
  262.         dec     bx
  263.  
  264.         jmp     @@RestoreText
  265.  
  266. @@Exit:
  267.         pop     es
  268.         pop     di
  269.         pop     cx
  270.         pop     bx
  271.         pop     ax
  272.         ret
  273. RestoreScreen   endp
  274.  
  275. ;Реализует видеоэффект:
  276. ; Начинает удалять с экрана сначала крайние столбцы потом верхние
  277. ; и нижние строки, пока текст не исчезнет.
  278. ; Потом текст начинает разворачиваться в обратном порядке.
  279. ;вход:
  280. ; нет
  281. ;выход:
  282. ; нет
  283. VideoTrick      proc
  284.         ;скрыть текст на экране, сделав атрибуты символов чёрными
  285.         call    HideScreen
  286.         ;показать текст на экране, сделав атрибуты символов белыми
  287.         call    RestoreScreen
  288.         ret
  289. VideoTrick      endp
  290.  
  291. main    proc
  292.         mov     ax,     @data
  293.         mov     ds,     ax
  294.  
  295.         call    FillScreen      ;заполнение экрана символами
  296.  
  297.         call    Delay           ;небольшая пауза перед видеоэффектом
  298.  
  299.         call    VideoTrick      ;видеоэффект
  300.  
  301.         call    Delay           ;небольшая пауза после видеоэффекта
  302.  
  303.         ;завершение программы
  304.         mov     ax,     4C00h
  305.         int     21h
  306. main    endp
  307.  
  308. end     main

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут