Флаг Норвегии и Панамы - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, ребята, в универе начали изучать ассемблер и мне срочно нужна помощь в написании программы, ибо после языков высокоуровневых ассемблер совсем не понятен. А преподаватель считает, что мы уже всё знаем и умеем... Суть программы в следующем: нужно сделать меню на цифры 1 и 2. При нажатии на 1 - выводится флаг Норвегии в текстовом режиме. Затем, чтобы вернуться в меню нужно нажать Esc и при нажатии на 2 - выводится флаг Панамы в графическом режиме. Опять же, при нажатии Esc мы выходим в меню, а если находясь в меню нажать Esc - выходим из программы. Дал пример кода флага Бенина, сказал, что можно использовать как-то его:
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
Но я даже понятия не имею, как мне такое реализовать, куда это всё пихать. На каком-нибудь CИ или C++ с использованием SDL - легко. А тут что-то вообще не понимаю. В общем, очень прошу помочь с этим делом...

Решение задачи: «Флаг Норвегии и Панамы»

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.714 из 5