Флаг Норвегии и Панамы - Assembler
Формулировка задачи:
Здравствуйте, ребята, в универе начали изучать ассемблер и мне срочно нужна помощь в написании программы, ибо после языков высокоуровневых ассемблер совсем не понятен. А преподаватель считает, что мы уже всё знаем и умеем...
Суть программы в следующем: нужно сделать меню на цифры 1 и 2. При нажатии на 1 - выводится флаг Норвегии в текстовом режиме. Затем, чтобы вернуться в меню нужно нажать Esc и при нажатии на 2 - выводится флаг Панамы в графическом режиме. Опять же, при нажатии Esc мы выходим в меню, а если находясь в меню нажать Esc - выходим из программы.
Дал пример кода флага Бенина, сказал, что можно использовать как-то его:
Так же дал кусок кода для реализации меню:
Но я даже понятия не имею, как мне такое реализовать, куда это всё пихать. На каком-нибудь CИ или C++ с использованием SDL - легко. А тут что-то вообще не понимаю. В общем, очень прошу помочь с этим делом...
Листинг программы
- gotoYX macro y, x ;
- xor bh, bh
- mov dl, x
- mov dh, y
- mov ah, 2
- int 10h
- endm
- ;++++
- stk1 segment para stack 'stack'
- dw 128 dup ('AB')
- stk1 ends
- ;------------------
- Dat1 segment para 'data'
- Text1 db 'Press <Enter> to terminate program1 $'
- StrUp db 17 dup (219, 0Ah), 34 dup (219,0Eh)
- StrDn db 17 dup (219, 10), 34 dup (219, 12)
- X db ?
- Y db ?
- XN db 15
- YN db 4
- Dat1 ends
- Proga4 segment para 'code'
- assume cs: Proga4, ss: stk1
- assume ds: Dat1, es:Dat1
- Start1:
- mov ax, seg Dat1
- mov ds, ax
- mov es, ax
- mov ax, 3
- int 10h
- lea bp, StrUp
- mov cx, 9
- mov X, 14
- mov Y, 4
- Rectangle:
- push cx
- xor bh, bh
- mov al, 2
- mov dl, X
- mov dh, Y
- mov cx, 51
- mov ah, 13h; 12h использовать в дз
- int 10h
- inc Y
- pop cx
- loop Rectangle
- lea bp, StrDn
- mov cx, 9
- mov X, 14
- mov Y, 13
- Rectangle1:
- push cx
- xor bh, bh
- mov al, 2
- mov dl, X
- mov dh, Y
- mov cx, 51
- mov ah, 13h
- int 10h
- inc Y
- pop cx
- loop Rectangle1
- gotoYX 24,0
- mov ah, 9
- lea dx, Text1
- int 21h
- mov ah, 10h
- int 16h
- mov ax, 4c00h
- int 21h
- Proga4 ends
- end Start1
Листинг программы
- i db ?
- ItemRead:
- mov ah, 10h
- int 16h
- mov i, al
- cmp i, '1'
- jz TextFlag
- cmp i, 32h
- je GraphFlag
- cmp i, 1bh
- jz Exit1
- jmp ItemRead
Решение задачи: «Флаг Норвегии и Панамы»
textual
Листинг программы
- stk1 segment para stack 'stack'
- dw 128 dup ('AB')
- stk1 ends
- ;------------------
- Dat1 segment para 'data'
- Menu db '1 - Show Norway Flag (text)', 0Dh, 0Ah
- db '2 - Show Panama Flag (graphic)', 0Dh, 0Ah
- db 'Press ESC to terminate program', '$'
- ;коды цветов символов и точек в графическом режиме
- Red equ 4
- Gray equ 7
- Blue equ 1
- White equ 15
- ;коды цветов фона
- bkRed equ Red shl 4
- bkWhite equ Gray shl 4
- bkBlue equ Blue shl 4
- ;коды нажатых клавиш
- kbESC equ 01Bh
- ;Строка изображения флага в формате
- ; NLines, N1, C1, N2, C2, ..., 0
- ; NLines - количество повторений строки
- ; N1, C1 - пара - количество символов и цвет символа
- ; в конце пар стоит признак конца строки - 0
- Norway1 db 7, 7, bkRed, 1, bkWhite, 2, bkBlue, 1, bkWhite, 16, bkRed, 0
- Norway2 db 1, 8, bkWhite, 2, bkBlue, 17, bkWhite, 0
- Norway3 db 2, 27, bkBlue, 0
- Norway4 db 1, 8, bkWhite, 2, bkBlue, 17, bkWhite, 0
- Norway5 db 7, 7, bkRed, 1, bkWhite, 2, bkBlue, 1, bkWhite, 16, bkRed, 0
- Dat1 ends
- Proga4 segment para 'code'
- assume cs: Proga4, ss: stk1
- assume ds: Dat1, es:Dat1
- Start1:
- mov ax, seg Dat1
- mov ds, ax
- mov es, ax
- ItemRead:
- mov ax, 0003h
- int 10h
- mov ah, 09h
- lea dx, Menu
- int 21h
- mov ah, 10h
- int 16h
- cmp al, '1'
- je TextFlag
- cmp al, '2'
- je GraphFlag
- cmp al, kbESC
- jz Exit1
- jmp ItemRead
- TextFlag:
- call Norway
- jmp ItemRead
- GraphFlag:
- call Panama
- jmp ItemRead
- Exit1:
- mov ax, 4c00h
- int 21h
- ;рисование флага Норвегии в текстовом режиме
- Norway proc
- push ax
- push dx
- ;очистка экрана способом установки текстового режима
- mov ax, 0003h
- int 10h
- ;установка курсора для центрования флага
- mov dx, 4*256+13
- call SetXY
- ;рисование 1-го участка флага
- lea dx, Norway1
- call ShowLines
- ;рисование 2-го участка флага
- lea dx, Norway2
- call ShowLines
- ;рисование 3-го участка флага
- lea dx, Norway3
- call ShowLines
- ;рисование 4-го участка флага
- lea dx, Norway4
- call ShowLines
- ;рисование 5-го участка флага
- lea dx, Norway5
- call ShowLines
- ;ожидание нажатия клавиши
- mov ah, 10h
- int 16h
- pop dx
- pop ax
- ret
- Norway endp
- ShowLines proc
- ;читать текущий видеорежим
- ;возвращает в AL = текущий режим (см. функцию 00H)
- ; AH = число текстовых колонок на экране
- ; BH = текущий номер активной страницы дисплея
- mov ah, 0Fh
- int 10h
- mov si, dx
- mov di, dx
- ;количество повторов строки
- mov cx, 0
- mov cl, [si]
- inc si
- inc di
- jcxz @@Exit
- @@Lines:
- mov si, di
- @@Columns:
- ;вывод строки
- mov al, [si]
- inc si
- or al, al
- jz @@Continue
- push cx
- mov ch, 0 ;cx - количество повторов
- mov cl, al
- shl cx, 1
- mov bl, [si] ;цвет символа
- inc si
- mov al, ' ' ;символ пробел
- mov ah, 09h
- int 10h
- call GetXY
- add dl, cl
- call SetXY
- pop cx
- jmp @@Columns
- @@Continue:
- call GetXY
- inc dh
- mov dl, 0+13
- call SetXY
- loop @@Lines
- @@Exit:
- ret
- ShowLines endp
- GetXY proc
- push ax
- push bx
- push cx
- ;читать текущий видеорежим
- ;возвращает в AL = текущий режим (см. функцию 00H)
- ; AH = число текстовых колонок на экране
- ; BH = текущий номер активной страницы дисплея
- mov ah, 0Fh
- int 10h
- mov ah, 03h
- int 10h
- pop cx
- pop bx
- pop ax
- ret
- GetXY endp
- SetXY proc
- push ax
- push bx
- push cx
- ;читать текущий видеорежим
- ;возвращает в AL = текущий режим (см. функцию 00H)
- ; AH = число текстовых колонок на экране
- ; BH = текущий номер активной страницы дисплея
- mov ah, 0Fh
- int 10h
- mov ah, 02h
- int 10h
- pop cx
- pop bx
- pop ax
- ret
- SetXY endp
- ;макрос для упрощения вызова процедур с параметрами
- invoke macro CallProc, Params
- IRP P, <Params>
- mov ax, P
- push ax
- endm
- call CallProc
- endm
- ;рисование флага Панамы в графическом режиме
- Panama proc
- push ax
- push bx
- mov ax, 0013h ;переключение в графический режим
- int 10h
- ;размеры флага
- SizeX equ 100
- SizeY equ 80
- ShiftX equ (320-2*SizeX)/2
- ShiftY equ (200-2*SizeY)/2
- ;рисование четырёх прямоугольников (участков флага)
- invoke Bar, <SizeY, SizeX, 0 +ShiftY, 0+ShiftX, White>
- invoke Bar, <SizeY, SizeX, 0 +ShiftY, SizeX+ShiftX, Red>
- invoke Bar, <SizeY, SizeX, SizeY+ShiftY, SizeX+ShiftX, White>
- invoke Bar, <SizeY, SizeX, SizeY+ShiftY, 0+ShiftX, Blue>
- ;ожидание нажатия клавиши
- mov ah, 10h
- int 16h
- mov ax, 0003h ;переключение в текстовый режим
- int 10h
- pop bx
- pop ax
- ret
- Panama endp
- ;рисование полосы (залитого прямоугольника)
- ;на входе:
- ; color - цвет заливки
- ; x_pos, y_pos - координаты левого верхнего угла
- ; x_size, y_size - размеры прямоугольника
- ;на выходе:
- ; -
- Bar proc color: word, x_pos:word, y_pos: word, x_size: word, y_size: word
- push bp ;формирование кадра параметров
- mov bp, sp
- push ax ;сохранение регистров
- push bx
- push cx
- push dx
- push si
- push di
- mov ah, 0Ch ; настройка параметров для вызова функции 0Ch
- mov al, byte ptr color ;цвет точек
- mov bh, 0 ;номер видеостраницы
- mov dx, y_pos ;строка
- mov cx, x_pos ;колонка
- mov di, y_size
- @@Vertical:
- mov cx, x_pos ;колонка
- mov si, x_size ;вывести x_size точек в горизонтальной линии
- @@Horizontal:
- int 10h ;вывести точку
- inc cx ;прирастить координату x
- dec si
- jnz @@Horizontal
- inc dx ;переход к следующей горизонтальной линии с
- dec di
- jnz @@Vertical
- pop di ;восстановление рагистров
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- pop bp
- ret 10 ;удаление параметров из стека
- Bar endp
- Proga4 ends
- end Start1
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д