Флаг Норвегии и Панамы - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д