РАСЧЕТНО-ГРАФИЧЕСКОЕ ЗАДАНИЕ 3

Задание

Написать программу на Ассемблере, выводящую на экран флаг указанной страны. Флаг изображается в виде квадрата, раскрашенного в несколько цветов. Сторона квадрата вводится с клавиатуры. В указанных ниже вариантах цвета областей обозначены одной буквой: б-белый, ч-черный, к-красный, ж-желтый, з-зеленый, г-голубой, с-синий. Если цвет не указан, то предполагается белый.

Варианты

1. Люксембург

2. Монако

3. Нидерланды

4. Польша

5. Румыния

6. Финляндия

7. Франция

8. Германия

9. Швеция

10. Бангладеш

11. Кувейт

12. Лаос

13. ОАЭ

14. Тайланд

15. Япония

16. Габон

17. Гвинея

18. Маврикий

19. Мадагаскар

20. Мали

21. Нигерия

22. Судан

23. Сьерра-Леоне

24. Чад

25. Эфиопия

26. Багамские острова

27. Тринидад и Тобаго

28. Ямайка

29. Науру

30. Тонга

ПРИМЕР ВЫПОЛНЕНИЯ ЗАДАНИЯ

Рассмотрим следующий флаг, состоящий из треугольника и двух трапеций:

Флаг раскрашен в 3 цвета: треугольник – синий, верхняя трапеция – белая, нижняя трапеция – красная. Этот флаг принадлежал ранее Чехословакии. Обозначим сторону квадрата через а. Точка (x, y) принадлежит треугольнику, если и только если y ≥ x и x + y ≤ а. (Координата y отсчитывается от верхнего левого угла и является номером строки, содержащей данную точку. Верхняя строка задается равенством y =0.)

Будем выводить точки с помощью функции 0Ch прерывания 10h. Для вывода точки этим способом необходимо задать:

AH  = 0Ch,

AL  — цвет точки,

BH  = 0 – номер страницы,

CX  = x,

DX  = y.

и выполнить команду int 10h.

Точка (x,y) будет пробегать слева направо строки экрана, начиная с верхней. Если выполнены неравенства

                     y ≥ x       и       a — x ≥ y,

то, в теле цикла, в регистр AL записывается синий цвет (1), иначе в случае     y < a / 2 в AL записывается белый, а в случае y ≥ a / 2 – красный цвет.

Перед установкой графического режима в стек запоминается текущий видеорежим. После вывода флага ожидается ввод символа с клавиатуры. Затем видеорежим восстанавливается из стека. Сторона квадрата вводится, как это описано в п. 5.3.

Программа

< 1 > title a23.com

< 2 > codesg SEGMENT

< 3 > assume cs:codesg, ds:codesg

< 4 > org   100h

< 5 > begin:

< 6 > jmp   short main

< 7 > a           dw    320

< 8 > a2    dw    ?

< 9 >

< 10 >main  proc near

< 11 >mov   dl,’a’ ;вывод

< 12 >mov   ah,2   ;а

< 13 >int   21h

< 14 >mov   dl,’=’ ;вывод

< 15 >mov   ah,2   ;=

< 16 >int   21h

< 17 >;——ввод стороны а———-

< 18 >mov   bx,0

< 19 >mov   si,10

< 20 >mov   cx,5

< 21 >next:

< 22 >mov   ah,1   ;ввод символа

< 23 >int   21h    ;в AL

< 24 >cmp   al,’ ‘

< 25 >je    back

< 26 >and   ax,15  ;оставить цифру

< 27 >mov   di,ax

< 28 >mov   ax,bx

< 29 >mul   si

< 30 >add   ax,di  ;AX = 10*BX + цифра

< 31 >mov   bx,ax

< 32 >loop  next

< 33 >back:

< 34 >mov   a,bx

< 35 >sar   bx,1   ;BX = BX/2

< 36 >mov   a2,bx

< 37 >;——сохранение и установка видеорежима

< 38 >mov   ah,0Fh ;сохранение

< 39 >int   10h

< 40 >push  ax

< 41 >mov   ax, 0013h         ;установка

< 42 >int   10h

< 43 >mov   dx,0   ;y

< 44 >mov   cx,0   ;x

< 45 >a20:

< 46 >mov   ax,a

< 47 >sub   ax,cx  ;AX = a-x

< 48 >cmp   dx,cx  ;y >= x?

< 49 >jb    a30    ;нет

< 50 >cmp   ax,dx  ;a-x >= y?

< 51 >jb    a30

< 52 >mov   al,1   ;точка из треугольника

< 53 >jmp   pix    ;вывод точки

< 54 >a30:

< 55 >mov   al,15  ;белый

< 56 >cmp   dx,a2  ;y < a2?

< 57 >jb    pix    ;если белый цвет

< 58 >mov   al,4   ;красный

< 59 >pix:

< 60 >mov   ah,0Ch ;вывод точки

< 61 >mov   bh,0   ;страница

int   10h   ;CX = x, DX = y

< 1 >

< 2 > inc   cx

< 3 > cmp   cx,a

< 4 > jne   a20

< 5 > mov   cx,0

< 6 > inc   dx

< 7 > cmp   dx,200 ;DX >= 200?

< 8 > jae   exit   ;да

< 9 > cmp   dx,a   ;DX < a?

< 10 >jb    a20    ;да

< 11 >exit:

< 12 >mov   ax,0   ;ожидание

< 13 >int   16h

< 14 >pop   ax     ;восстановление

< 15 >mov   ah,0   ;видеорежима

< 16 >int   10h

< 17 >ret          ;выход из программы

< 18 >main  endp

< 19 >codesg ENDS

< 20 > end begin