Проверка элемента структуры, а потом вывод - Assembler

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

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

Здравствуйте, 3 день думаю над задачей:
Сформировать записи, которые содержат информацию о N поездов, отправляющихся с вокзала станции Хмельницкий (номер поезда, станция назначения, время отправления, время прибытия). Напечатать информацию о поездах, время в пути которых не превышает 17 часов.
Гуглил, но там код связки С с ASM. А из учебников просто пример объявления структуры. Вот что пока что есть:
Листинг программы
  1. masm
  2. model small
  3. stack 256
  4. .586P
  5. trains STRUCT ; тип данных СТРУКТУРА с именем DATE1
  6. number db ? ; имя первого поля структуры
  7. station db ? ; имя второго поля структуры
  8. v db ? ; имя третьего поля структуры
  9. p db ? ; имя четвертого поля структуры
  10. trains ENDS
  11. .data
  12. max db 0
  13. train1 trains <1,"Kiev",12,18>
  14. train2 trains <1,"Lviv",8,10>
  15. train3 trains <1,"Odessa",4,22>
  16. .code
  17. main:
  18. mov ax @data
  19. mov ds, ax
  20. xor dx,dx
  21. mov bx,3
  22. lea si,train1
  23.  
  24. print:
  25. xor ch, ch
  26. mov bx, 1
  27. mov ah, 40h
  28. int 21h
  29.  
  30. exit:
  31. mov ax, 4c00h
  32. int 21h
  33. end main
Прошу помощи.

Решение задачи: «Проверка элемента структуры, а потом вывод»

textual
Листинг программы
  1. .model small
  2.  
  3. .stack 100h
  4.  
  5. .data
  6.         CrLf    db      0Dh, 0Ah, '$'
  7.  
  8. TTrains struc
  9.         Flight          dw      ?               ;рейс
  10.         Destination     db      10 dup(' ')     ;станция назначения
  11.         DepartureHour   dw      ?               ;время отправления
  12.         DepartureMin    dw      ?               ;время отправления
  13.         ArrivalHour     dw      ?               ;время прибытия
  14.         ArrivalMin      dw      ?               ;время прибытия
  15. TTrains ends
  16.  
  17.         Timetables      label
  18.         TTrains  <1,'Kiev',   07,02, 12,15>
  19.         TTrains  <2,'Lviv',   17,02, 19,01>
  20.         TTrains  <3,'Odessa', 04,55, 07,15>
  21.         TTrains  <4,'Moscow', 01,33, 11,22>
  22.         TTrains  <5,'Paris',  02,27, 22,09>
  23.         TTrains  <6,'Berlin', 05,43, 15,31>
  24.  
  25.         N       dw      ($-Timetables)/(SIZE TTrains)
  26.  
  27. .code
  28.  
  29. main    proc
  30.         mov     ax,     @data
  31.         mov     ds,     ax
  32.  
  33.         mov     bx,     60      ;для вычисления времени от начала суток
  34.         lea     si,     Timetables
  35.         mov     cx,     N
  36. @@For:
  37.         ;вычисляем время следования
  38.         mov     ax,     TTrains([si]).DepartureHour
  39.         mul     bx
  40.         add     ax,     TTrains([si]).DepartureMin
  41.         mov     di,     ax
  42.         mov     ax,     TTrains([si]).ArrivalHour
  43.         mul     bx
  44.         add     ax,     TTrains([si]).ArrivalMin
  45.         sub     ax,     di
  46.         ;если время в пути не превышает 17 часов - вывести информацию о рейсе
  47.         cmp     ax,     17*60
  48.         ja      @@Next
  49.         ;вывод информации о рейсе
  50.         mov     ax,     TTrains([si]).Flight
  51.         call    Show_AX
  52.         mov     al,     ' '
  53.         int     29h
  54.         push    bx
  55.         push    cx
  56.         mov     ah,     40h
  57.         lea     dx,     TTrains([si]).Destination
  58.         mov     cx,     10
  59.         mov     bx,     1
  60.         int     21h
  61.         pop     cx
  62.         pop     bx
  63.         mov     ax,     TTrains([si]).DepartureHour
  64.         call    ShowLeadingZero
  65.         mov     al,     ':'
  66.         int     29h
  67.         mov     ax,     TTrains([si]).DepartureMin
  68.         call    ShowLeadingZero
  69.         mov     al,     ' '
  70.         int     29h
  71.         mov     ax,     TTrains([si]).ArrivalHour
  72.         call    ShowLeadingZero
  73.         mov     al,     ':'
  74.         int     29h
  75.         mov     ax,     TTrains([si]).ArrivalMin
  76.         call    ShowLeadingZero
  77.         mov     ah,     09h
  78.         lea     dx,     CrLf
  79.         int     21h
  80.  
  81. @@Next:
  82.         ;переходим к следующему элементу
  83.         add     si,     SIZE TTrains
  84.         loop    @@For
  85.  
  86.         mov     ax,     4C00h
  87.         int     21h
  88. main    endp
  89.  
  90. ; выводит число из регистра AX на экран
  91. ; входные данные:
  92. ; ax - число для отображения
  93. Show_AX proc
  94.         push    ax
  95.         push    bx
  96.         push    cx
  97.         push    dx
  98.         push    di
  99.  
  100.         mov     cx, 10
  101.         xor     di, di          ; di - кол. цифр в числе
  102.  
  103.         ; если число в ax отрицательное, то
  104.         ;1) напечатать '-'
  105.         ;2) сделать ax положительным
  106.         or      ax, ax
  107.         jns     @@Conv
  108.         push    ax
  109.         mov     dx, '-'
  110.         mov     ah, 2           ; ah - функция вывода символа на экран
  111.         int     21h
  112.         pop     ax
  113.  
  114.         neg     ax
  115.  
  116. @@Conv:
  117.         xor     dx, dx
  118.         div     cx              ; dl = num mod 10
  119.         add     dl, '0'         ; перевод в символьный формат
  120.         inc     di
  121.         push    dx              ; складываем в стэк
  122.         or      ax, ax
  123.         jnz     @@Conv
  124.         ; выводим из стэка на экран
  125. @@Show:
  126.         pop     dx              ; dl = очередной символ
  127.         mov     ah, 2           ; ah - функция вывода символа на экран
  128.         int     21h
  129.         dec     di              ; повторяем пока di<>0
  130.         jnz     @@Show
  131.  
  132.         pop     di
  133.         pop     dx
  134.         pop     cx
  135.         pop     bx
  136.         pop     ax
  137.         ret
  138. Show_AX endp
  139.  
  140. ShowLeadingZero proc
  141.         cmp     ax,     10
  142.         jae     @@Skip
  143.         push    ax
  144.         mov     al,     '0'
  145.         int     29h
  146.         pop     ax
  147. @@Skip:
  148.         call    Show_AX
  149.         ret
  150. ShowLeadingZero endp
  151.  
  152. end     main

Объяснение кода листинга программы

  1. Объявляется структура TTrains с полями Flight, Destination, DepartureHour, DepartureMin, ArrivalHour, ArrivalMin.
  2. Создается метка Timetables.
  3. Заполняются данные о поездах в структуру TTrains.
  4. Вычисляется количество элементов в Timetables и сохраняется в переменной N.
  5. В процедуре main инициализируются регистры и указатели для цикла.
  6. В цикле проверяется время в пути каждого поезда.
  7. Если время в пути не превышает 17 часов, то выводится информация о рейсе (номер, станция назначения, время отправления и время прибытия) с использованием процедур Show_AX и ShowLeadingZero.
  8. Происходит переход к следующему элементу и повторение цикла.
  9. Программа завершается с помощью команд mov ax, 4C00h и int 21h.

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


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

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

6   голосов , оценка 4.333 из 5

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

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

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