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

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

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

Здравствуйте, ребята, в универе начали изучать ассемблер и мне срочно нужна помощь в написании программы, ибо после языков высокоуровневых ассемблер совсем не понятен. А преподаватель считает, что мы уже всё знаем и умеем... Суть программы в следующем: нужно сделать меню на цифры 1 и 2. При нажатии на 1 - выводится флаг Норвегии в текстовом режиме. Затем, чтобы вернуться в меню нужно нажать Esc и при нажатии на 2 - выводится флаг Панамы в графическом режиме. Опять же, при нажатии Esc мы выходим в меню, а если находясь в меню нажать Esc - выходим из программы. Дал пример кода флага Бенина, сказал, что можно использовать как-то его:
Листинг программы
  1. gotoYX macro y, x ;
  2. xor bh, bh
  3. mov dl, x
  4. mov dh, y
  5. mov ah, 2
  6. int 10h
  7. endm
  8. ;++++
  9. stk1 segment para stack 'stack'
  10. dw 128 dup ('AB')
  11. stk1 ends
  12. ;------------------
  13. Dat1 segment para 'data'
  14. Text1 db 'Press <Enter> to terminate program1 $'
  15. StrUp db 17 dup (219, 0Ah), 34 dup (219,0Eh)
  16. StrDn db 17 dup (219, 10), 34 dup (219, 12)
  17. X db ?
  18. Y db ?
  19. XN db 15
  20. YN db 4
  21. Dat1 ends
  22. Proga4 segment para 'code'
  23. assume cs: Proga4, ss: stk1
  24. assume ds: Dat1, es:Dat1
  25. Start1:
  26. mov ax, seg Dat1
  27. mov ds, ax
  28. mov es, ax
  29. mov ax, 3
  30. int 10h
  31. lea bp, StrUp
  32. mov cx, 9
  33. mov X, 14
  34. mov Y, 4
  35. Rectangle:
  36. push cx
  37. xor bh, bh
  38. mov al, 2
  39. mov dl, X
  40. mov dh, Y
  41. mov cx, 51
  42. mov ah, 13h; 12h использовать в дз
  43. int 10h
  44. inc Y
  45. pop cx
  46. loop Rectangle
  47. lea bp, StrDn
  48. mov cx, 9
  49. mov X, 14
  50. mov Y, 13
  51. Rectangle1:
  52. push cx
  53. xor bh, bh
  54. mov al, 2
  55. mov dl, X
  56. mov dh, Y
  57. mov cx, 51
  58. mov ah, 13h
  59. int 10h
  60. inc Y
  61. pop cx
  62. loop Rectangle1
  63. gotoYX 24,0
  64. mov ah, 9
  65. lea dx, Text1
  66. int 21h
  67. mov ah, 10h
  68. int 16h
  69. mov ax, 4c00h
  70. int 21h
  71. Proga4 ends
  72. end Start1
Так же дал кусок кода для реализации меню:
Листинг программы
  1. i db ?
  2. ItemRead:
  3. mov ah, 10h
  4. int 16h
  5. mov i, al
  6. cmp i, '1'
  7. jz TextFlag
  8. cmp i, 32h
  9. je GraphFlag
  10. cmp i, 1bh
  11. jz Exit1
  12. jmp ItemRead
Но я даже понятия не имею, как мне такое реализовать, куда это всё пихать. На каком-нибудь CИ или C++ с использованием SDL - легко. А тут что-то вообще не понимаю. В общем, очень прошу помочь с этим делом...

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

textual
Листинг программы
  1. stk1 segment para stack 'stack'
  2. dw 128 dup ('AB')
  3. stk1 ends
  4. ;------------------
  5. Dat1 segment para 'data'
  6. Menu    db '1 - Show Norway Flag (text)', 0Dh, 0Ah
  7.         db '2 - Show Panama Flag (graphic)', 0Dh, 0Ah
  8.         db 'Press ESC to terminate program', '$'
  9.  
  10. ;коды цветов символов и точек в графическом режиме
  11. Red     equ     4
  12. Gray    equ     7
  13. Blue    equ     1
  14. White   equ     15
  15. ;коды цветов фона
  16. bkRed   equ     Red shl 4
  17. bkWhite equ     Gray shl 4
  18. bkBlue  equ     Blue shl 4
  19. ;коды нажатых клавиш
  20. kbESC   equ     01Bh
  21. ;Строка изображения флага в формате
  22. ; NLines, N1, C1, N2, C2, ..., 0
  23. ; NLines - количество повторений строки
  24. ; N1, C1 - пара - количество символов и цвет символа
  25. ; в конце пар стоит признак конца строки - 0
  26. Norway1 db 7, 7, bkRed, 1, bkWhite, 2, bkBlue, 1, bkWhite, 16, bkRed, 0
  27. Norway2 db 1, 8, bkWhite, 2, bkBlue, 17, bkWhite, 0
  28. Norway3 db 2, 27, bkBlue, 0
  29. Norway4 db 1, 8, bkWhite, 2, bkBlue, 17, bkWhite, 0
  30. Norway5 db 7, 7, bkRed, 1, bkWhite, 2, bkBlue, 1, bkWhite, 16, bkRed, 0
  31.  
  32. Dat1 ends
  33.  
  34. Proga4 segment para 'code'
  35. assume cs: Proga4, ss: stk1
  36. assume ds: Dat1, es:Dat1
  37.  
  38. Start1:
  39.     mov ax, seg Dat1
  40.     mov ds, ax
  41.     mov es, ax
  42.  
  43. ItemRead:
  44.     mov ax, 0003h
  45.     int 10h
  46.     mov ah, 09h
  47.     lea dx, Menu
  48.     int 21h
  49.     mov ah, 10h
  50.     int 16h
  51.     cmp al, '1'
  52.     je TextFlag
  53.     cmp al, '2'
  54.     je GraphFlag
  55.     cmp al, kbESC
  56.     jz Exit1
  57.     jmp ItemRead
  58.  
  59. TextFlag:
  60.     call Norway
  61.     jmp ItemRead
  62.  
  63. GraphFlag:
  64.     call Panama
  65.     jmp ItemRead
  66.  
  67. Exit1:
  68.     mov ax, 4c00h
  69.     int 21h
  70.  
  71. ;рисование флага Норвегии в текстовом режиме
  72. Norway  proc
  73.         push    ax
  74.         push    dx
  75.         ;очистка экрана способом установки текстового режима
  76.         mov     ax,     0003h
  77.         int     10h
  78.         ;установка курсора для центрования флага
  79.         mov     dx,     4*256+13
  80.         call    SetXY
  81.         ;рисование 1-го участка флага
  82.         lea     dx,     Norway1
  83.         call    ShowLines
  84.         ;рисование 2-го участка флага
  85.         lea     dx,     Norway2
  86.         call    ShowLines
  87.         ;рисование 3-го участка флага
  88.         lea     dx,     Norway3
  89.         call    ShowLines
  90.         ;рисование 4-го участка флага
  91.         lea     dx,     Norway4
  92.         call    ShowLines
  93.         ;рисование 5-го участка флага
  94.         lea     dx,     Norway5
  95.         call    ShowLines
  96.         ;ожидание нажатия клавиши
  97.         mov     ah,     10h
  98.         int     16h
  99.  
  100.         pop     dx
  101.         pop     ax
  102.         ret
  103. Norway  endp
  104.  
  105. ShowLines       proc
  106.         ;читать текущий видеорежим
  107.         ;возвращает в AL = текущий режим (см. функцию 00H)
  108.         ;             AH = число текстовых колонок на экране
  109.         ;             BH = текущий номер активной страницы дисплея
  110.         mov     ah,     0Fh
  111.         int     10h
  112.  
  113.         mov     si,     dx
  114.         mov     di,     dx
  115.         ;количество повторов строки
  116.         mov     cx,     0
  117.         mov     cl,     [si]
  118.         inc     si
  119.         inc     di
  120.         jcxz    @@Exit
  121. @@Lines:
  122.         mov     si,     di
  123. @@Columns:
  124.         ;вывод строки
  125.         mov     al,     [si]
  126.         inc     si
  127.         or      al,     al
  128.         jz      @@Continue
  129.         push    cx
  130.         mov     ch,     0       ;cx - количество повторов
  131.         mov     cl,     al
  132.         shl     cx,     1
  133.         mov     bl,     [si]    ;цвет символа
  134.         inc     si
  135.         mov     al,     ' '     ;символ пробел
  136.         mov     ah,     09h
  137.         int     10h
  138.         call    GetXY
  139.         add     dl, cl
  140.         call    SetXY
  141.         pop     cx
  142.         jmp     @@Columns
  143. @@Continue:
  144.         call    GetXY
  145.         inc     dh
  146.         mov     dl,     0+13
  147.         call    SetXY
  148.         loop    @@Lines
  149. @@Exit:
  150.         ret
  151. ShowLines       endp
  152.  
  153. GetXY   proc
  154.         push    ax
  155.         push    bx
  156.         push    cx
  157.         ;читать текущий видеорежим
  158.         ;возвращает в AL = текущий режим (см. функцию 00H)
  159.         ;             AH = число текстовых колонок на экране
  160.         ;             BH = текущий номер активной страницы дисплея
  161.         mov     ah,     0Fh
  162.         int     10h
  163.  
  164.         mov     ah,     03h
  165.         int     10h
  166.         pop     cx
  167.         pop     bx
  168.         pop     ax
  169.         ret
  170. GetXY   endp
  171.  
  172. SetXY   proc
  173.         push    ax
  174.         push    bx
  175.         push    cx
  176.         ;читать текущий видеорежим
  177.         ;возвращает в AL = текущий режим (см. функцию 00H)
  178.         ;             AH = число текстовых колонок на экране
  179.         ;             BH = текущий номер активной страницы дисплея
  180.         mov     ah,     0Fh
  181.         int     10h
  182.  
  183.         mov     ah,     02h
  184.         int     10h
  185.         pop     cx
  186.         pop     bx
  187.         pop     ax
  188.         ret
  189. SetXY   endp
  190.  
  191. ;макрос для упрощения вызова процедур с параметрами
  192. invoke  macro   CallProc, Params
  193.         IRP     P, <Params>
  194.                 mov     ax,     P
  195.                 push    ax
  196.         endm
  197.         call    CallProc
  198. endm
  199.  
  200. ;рисование флага Панамы в графическом режиме
  201. Panama  proc
  202.         push    ax
  203.         push    bx
  204.  
  205.         mov     ax,     0013h   ;переключение в графический режим
  206.         int     10h
  207.         ;размеры флага
  208.         SizeX   equ     100
  209.         SizeY   equ     80
  210.         ShiftX  equ     (320-2*SizeX)/2
  211.         ShiftY  equ     (200-2*SizeY)/2
  212.         ;рисование четырёх прямоугольников (участков флага)
  213.         invoke  Bar, <SizeY, SizeX, 0    +ShiftY, 0+ShiftX,     White>
  214.         invoke  Bar, <SizeY, SizeX, 0    +ShiftY, SizeX+ShiftX, Red>
  215.         invoke  Bar, <SizeY, SizeX, SizeY+ShiftY, SizeX+ShiftX, White>
  216.         invoke  Bar, <SizeY, SizeX, SizeY+ShiftY, 0+ShiftX,     Blue>
  217.         ;ожидание нажатия клавиши
  218.         mov     ah,     10h
  219.         int     16h
  220.  
  221.         mov     ax,     0003h   ;переключение в текстовый режим
  222.         int     10h
  223.  
  224.         pop     bx
  225.         pop     ax
  226.         ret
  227. Panama  endp
  228.  
  229. ;рисование полосы (залитого прямоугольника)
  230. ;на входе:
  231. ; color - цвет заливки
  232. ; x_pos, y_pos - координаты левого верхнего угла
  233. ; x_size, y_size - размеры прямоугольника
  234. ;на выходе:
  235. ; -
  236. Bar     proc    color: word, x_pos:word, y_pos: word, x_size: word, y_size: word
  237.         push    bp                      ;формирование кадра параметров
  238.         mov     bp,     sp
  239.  
  240.         push    ax                      ;сохранение регистров
  241.         push    bx
  242.         push    cx
  243.         push    dx
  244.         push    si
  245.         push    di
  246.  
  247.         mov     ah,     0Ch             ; настройка параметров для вызова функции 0Ch
  248.         mov     al,     byte ptr color           ;цвет точек
  249.         mov     bh,     0               ;номер видеостраницы
  250.         mov     dx,     y_pos           ;строка
  251.         mov     cx,     x_pos           ;колонка
  252.  
  253.         mov     di,     y_size
  254. @@Vertical:
  255.  
  256.         mov     cx,     x_pos           ;колонка
  257.         mov     si,     x_size          ;вывести x_size точек в горизонтальной линии
  258. @@Horizontal:
  259.         int     10h                     ;вывести точку
  260.         inc     cx                      ;прирастить координату x
  261.         dec     si
  262.         jnz     @@Horizontal
  263.  
  264.         inc     dx                      ;переход к следующей горизонтальной линии с
  265.         dec     di
  266.         jnz     @@Vertical
  267.  
  268.         pop     di                      ;восстановление рагистров
  269.         pop     si
  270.         pop     dx
  271.         pop     cx
  272.         pop     bx
  273.         pop     ax
  274.  
  275.         pop     bp
  276.         ret     10                      ;удаление параметров из стека
  277. Bar     endp
  278.  
  279. Proga4 ends
  280.     end Start1

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут