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