Флаг Норвегии и Панамы - 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 Start1i 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